为什么要在~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;
}

解决方案 »

  1.   

    这是虚函数的特性,因为有虚表的存在。因为你使用CBASE类型的指针,你将这个指针POINT向一个CCHILD对象,没有问题,因为是BASE 类,所以按照类型转换是隐士的,但如果你在两个类中都有方法是,如果一般情况按照指针的类型来调用,而使用VIRTUAL是告诉计算机这个必须特殊处理,应该检查指针POINT的哪个对象的该函数,因此就出现你说的这种情况了。
    没有什么奇怪,看一下C++的虚表部分。
      

  2.   

    CBase *p;
    p=new CChild;   //p到底是什么类型的指针,没见过这么定义的
    ----------------------------------------------------
    你的代码我看了很不解,你说的地方virtual删去完全不影响程序。上面两行也应改成:
    CBase *p;
    p=new CBase;或:
    CChild *p;
    p=new CChild;后来我用上面改过的代码运行确实无误。
      

  3.   

    如果从学习研究的角度把代码写成你这样的话,那楼上windcsn(向所有的朋友学习!) 的正解。
    工作中的话最好别这样写。
      

  4.   

    工作中当然最好别这样写,
    但是在函数调用的时候,这样做可以利用多态性来节约函数的。比如:
    void Function(CBase *p)
    {
        p->成员函数();
    }CChild *q = new Child();
    Function(q);
      

  5.   

    virtual 有个特性就是运行时确定
    你编译的时候并不知道该调用哪个解析函数
    只有到运行是遇到delete时它会去判断到底用哪个解析函数c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的是,派生类的析构函数永远不会被调用。这是《Effective c++》里的一段话