析构函数可以为什么可以定义为虚函数,能否写个最简单的程序让小第看下呢,该怎么解决
析构函数可以为什么可以定义为虚函数,能否写个最简单的程序让小第看下呢
析构函数可以为什么可以定义为虚函数,能否写个最简单的程序让小第看下呢
看了书上的一些关于虚函数的小例子,也看不出究竟虚函数,用在什么地方比较好.大家帮忙解释下,谢谢,
------解决方案--------------------
继承后,基类指针指向子类对象,
如果基类析构没有设置成virtual,那么就只会调用基类的析构函数
如果设置成virtual,会调用子类对象的析构函数。
------解决方案--------------------
不是为什么“可以”,而是为什么“需要”或者为什么“必须”
例子:
class A
{
public:
~A(){};
};
class B:public A
{
char * p;
public :
B(){p=new char[100];};
~B(){delete []p;};
};
下面代码因为~A不是虚函数导致系统不知道该析构B,导致内存泄漏
A* pb= new B;
delete pb;
当且仅当A的析垢函数是虚函数,系统才会调用B的析垢,明白了不?
------解决方案--------------------
class base
{
public:virtual ~base(){}
}
class derive1 : public base{}
class derive2 : public base
{
int* p;
public:
derive2(int x):p(new int[x]){}
~derive2(){delete[]p;}
}
void main()
{
base* p;
p = new derive1();
delete p;
p = new derive2();
delete p;
}
析构函数可以为什么可以定义为虚函数,能否写个最简单的程序让小第看下呢
看了书上的一些关于虚函数的小例子,也看不出究竟虚函数,用在什么地方比较好.大家帮忙解释下,谢谢,
------解决方案--------------------
继承后,基类指针指向子类对象,
如果基类析构没有设置成virtual,那么就只会调用基类的析构函数
如果设置成virtual,会调用子类对象的析构函数。
------解决方案--------------------
不是为什么“可以”,而是为什么“需要”或者为什么“必须”
例子:
class A
{
public:
~A(){};
};
class B:public A
{
char * p;
public :
B(){p=new char[100];};
~B(){delete []p;};
};
下面代码因为~A不是虚函数导致系统不知道该析构B,导致内存泄漏
A* pb= new B;
delete pb;
当且仅当A的析垢函数是虚函数,系统才会调用B的析垢,明白了不?
------解决方案--------------------
class base
{
public:virtual ~base(){}
}
class derive1 : public base{}
class derive2 : public base
{
int* p;
public:
derive2(int x):p(new int[x]){}
~derive2(){delete[]p;}
}
void main()
{
base* p;
p = new derive1();
delete p;
p = new derive2();
delete p;
}