为什么要在~CBase()前面加virtual以后,才能调用 ~CChild()呢?
谁能帮我解释详细一点呢?
非常的感谢!!
class CBase
{
public:
CBase()
{
cout<<"CBase!"<<endl;
}
virtual ~CBase()///////////
{
cout<<"De CBase!"<<endl;
}
};class CChild:public CBase
{public:
CChild()
{
cout<<"CChild!"<<endl;
}
~CChild()/////////////////////////
{
cout<<"De CChild!"<<endl;
}
};
void main()
{
CBase *p;
p=new CChild;
delete p;
}
谁能帮我解释详细一点呢?
非常的感谢!!
class CBase
{
public:
CBase()
{
cout<<"CBase!"<<endl;
}
virtual ~CBase()///////////
{
cout<<"De CBase!"<<endl;
}
};class CChild:public CBase
{public:
CChild()
{
cout<<"CChild!"<<endl;
}
~CChild()/////////////////////////
{
cout<<"De CChild!"<<endl;
}
};
void main()
{
CBase *p;
p=new CChild;
delete p;
}
没有什么奇怪,看一下C++的虚表部分。
p=new CChild; //p到底是什么类型的指针,没见过这么定义的
----------------------------------------------------
你的代码我看了很不解,你说的地方virtual删去完全不影响程序。上面两行也应改成:
CBase *p;
p=new CBase;或:
CChild *p;
p=new CChild;后来我用上面改过的代码运行确实无误。
工作中的话最好别这样写。
但是在函数调用的时候,这样做可以利用多态性来节约函数的。比如:
void Function(CBase *p)
{
p->成员函数();
}CChild *q = new Child();
Function(q);
你编译的时候并不知道该调用哪个解析函数
只有到运行是遇到delete时它会去判断到底用哪个解析函数c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的是,派生类的析构函数永远不会被调用。这是《Effective c++》里的一段话