当然有错,CBaseFormat又不是虚基类,怎么能这样用?

解决方案 »

  1.   

    基类是别人提供的!(DLL形式)怎么改!反正我的程序是死了!
      

  2.   

    the base :1
    the Ex :2
      

  3.   

    the base :1
    the Ex :2
      

  4.   

    你到底想做什么,分开不是很好吗?
    void main()
    {
        CBaseFormat* pBase = new CBaseFormat;
        CExFormat* pEx = new CExFormat;
        printf("the base :%d\n",pBase->m_nSth);
        printf("the Ex :%d\n", pEx->m_nSth);    delete pBase;
        delete pEx;
    }
      

  5.   

        CBassFormat(){ m_nSth=1; }
        ~CBassFormat(){}
    如果改成CBaseFormat的话,就是:
    1
    2
    不会是考眼力的吧。
      

  6.   

    wrong free way, the CBaseFormat's destructor should be virtual
      

  7.   

    delete pBase;调用基类析构函数,这样就跳过了CExFormat的析构函数,而new CExFormat
    调用了构造函数。
    基类的析构函数应该是虚函数。
      

  8.   

       对于不同的编译器可能会有问题,因为各个公司的编译器对c++标准的实现不尽相同
    我个人认为没有错。
       对于 -> 操作符,其输出的内容由指针的的类型决定。
       由于 new 的是 CExFormat 类,所以在进行指针类型显示转换时,
    不会出现 Object slicing,原因就是 CExFormat 是 CBaseFormat 的派生类。  如果 new 的是 CBaseFormat 就会出错,
     printf("the Ex :%d\n", ((CExFormat*)pBase)->m_nSth); 将不会输出正确的值。
      

  9.   

    是啊。多谢大家了!xiner(叉叉) 的风格很好!
    virtual ~CBassFormat(){}是少了,但是我不delete pBase;的话也是可以的:)
      

  10.   

       不要听那几个傻子胡说,怎么会跟基类是不是虚基有关系?
    只不知道,new 操作执行时,它的调用顺序?!!! 如果 new 派生类,那么它会先调用
    该派生类的基类的构造函数,然后再调用派生类的构造函数。
      

  11.   

    CBaseFormat* pBase = new CExFormat;
    这样使用是没问题的,   而且有时侯是必须的(为了实现多态么)
    不过基类的析构函数一定要是虚函树.
      

  12.   

    我想是这样 virtual ~CBassFormat(){}应该要,不然CExFormat没有删掉
      

  13.   

    http://www.csdn.net/expert/topic/461/461642.shtm
    解决这个问题先!