有点困惑,还望大家畅所欲言啦~~

解决方案 »

  1.   

    我也一样,MFC对多继承支持不好,尤其是使用了DECLARE_DNYCREATE之后
      

  2.   

    另外多重继承也是将COM接口结合到COM对象中基本方法之一,可以实现在一个COM对象中实现多个接口.
      

  3.   

    以下是个人的理解:
    在BCB中就有多重继承,在MFC中为了简化C++中的难度所以没有用到多生继承。
    多重继承是子类和父类如网状结构、简单继承如树型结构。
      

  4.   

    ATL中倒是常用到,其它的基本上没用到过
      

  5.   

    1.MFC不支持多继承(可以通过嵌套技术来模拟多继承)。class A {
     public:
      class B{
        public:
        class C{};
      };
    };2.多继承非常有用(ATL,WTL大量使用,我感觉非常有用!)3.代码更加简洁,易读。...
      

  6.   

    1、MFC没有接触过多重继承
    2、C++中学习过
      

  7.   

    to caslwzgks(梦想家) ,
    你所说的嵌套技术指的是MFC对COM的支持吧,MFC为了消除多重继承(MI)带来接口的混乱,从而采用了嵌套继承的方法。而正如你所说,ATL,WTL中大量使用了MI,可见MI的正面效应。
    bm1408(VC一线) ,
    MFC的确不是为MI所设计的,但这并不意味着用户不能在MFC应用程序中使用MI。所以,若要在MFC中使用MI,一方面要遵循MFC的要求,另一方面还要遵循C++的规范。---------------------------------------------------------------
    下面是我参照了资料的总结,请大家批评补充。
    ---------------------------------------------------------------
    1.CObject::IsKindOf函数对于使用MI的类来说就不能正确识别它的类型了,原因很简单,它父类有多个,这个函数无法确定了。用户确一定要保证在使用MI时,如果使用到了Cobject,一定要把它放在继承类的最左边。2.必须重新实现那些有二义性的函数。
      让我们来看下面一个例子
      class CListWnd : public CFrameWnd, public CObList
      {
        ...
      };
      CListWnd myListWnd;  上面的情况中,Cobject被包括了两次,这导致了两个问题:  一.对Cobject成员函数的调用必须是无二义的。
      myListWnd.Dump(afxDump); //这里会有一个编译错误,编译器不明白你调用的究竟是哪一个类 的Dump,是CFrameWnd::Dump还是CObList::Dump? 
      二.对静态成员函数包括'operator new'和'operator delete'的调用必须是无二义的。 这种情况编译器经常提醒你构造函数的位置,new和delete有二义性。所以,在上面的情况中,必须重新实现那些有二义性的函数,例如下面的代码class CListWnd : public CFrameWnd, public CObList
    {
    public:
    void* operator new(size_t nSize)   { return CFrameWnd::operator new(nSize); } //调用的是CframeWnd中的newvoid operator delete(void* p)  { CFrameWnd::operator delete(p); } //调用的是CframeWnd中的deletevoid Dump(CDumpContent& dc)  { CFrameWnd::Dump(dc);CObList::Dump(dc); }注意:使用虚继承并不能消除这种二义性。3.运行(runtime)类型机制支持一些宏:DECLARE_DYNAMIC,IMPLEMENT_DYNAMIC,DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE,DECLARE_SERIAL和IMPLEMENT_SERIAL,这些宏在单继承的时候工作得不错,可是对于多继承,出现在IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL中的必须是在继承关系最左边的基类。其中,对于消息映射有两项要求:   一.基类中只能有一个Wnd的导出类;
          错误例子:
          class CTwoWindows : public CFrameWnd, public CEdit
          { ... }; // 两个CWnd复本
       二.这个导出类必须在继承关系的最左边.
          错误例子:
          class CListEdit : public CObList, public CEdit
          { ... }; // Cedit(由CWnd导出)必须在最左边
      

  8.   

    在多重继承下,要注意可以产生一些"切片"slicing",还有什么虚函数,纯虚函数等等...