C++ 多重继承

c++ multiple inheritance

本文关键字:多重继承 C++      更新时间:2023-10-16

我无法弄清楚在以下情况下会发生什么:

class MBase {
    public:
       MBase(int) {}
       virtual char* vf() const = 0;
       virtual ~MBase() {}
};
class D1 : public MBase { //NOT VIRTUAL!!!
   public:
   D1() : MBase(1) {}
   char* vf() const { return "D1"; }
};
class D2 : virtual public MBase {
    public:
        D2() : MBase(2) {}
        char* vf() const { return "D2"; }
};
class Bottom : public D1, public D2 {
  public:
    char* vf() const { return "Bottom"; }
}
Base* b = new Bottom();  

在钻石的原始定义中,D1 和 D2 实际上都继承自 MBase,但这里只有一个。 我们是否仍然在 Bottom 对象中有两个单独的子对象,因此,最后一行将无法编译,因为编译器不知道要使用哪个子对象?

这在 C++03 标准的第 10.1.4 节中指定。 虚拟和非虚拟基地是独立的,因此每个基地都有一个。

通过扩展您的示例很容易看到这一点:

class MBase {
    public:
       MBase(int arg) { cerr << "MBase::MBase(" << arg << ")n"; }
       virtual const char* vf() const = 0;
       virtual ~MBase() {}
};
class D1 : public MBase { //NOT VIRTUAL!!!
   public:
   D1() : MBase(1) {}
   const char* vf() const { return "D1"; }
};
class D2 : virtual public MBase {
    public:
        D2() 
        : MBase(2) // This doesn't get used in this example because
                   // it is the responsibility of the most-derived
                   // class to initialize a virtual base, and D2 isn't
                   // the most-derived class in this example.
        {
        }
        const char* vf() const { return "D2"; }
};
class Bottom : public D1, public D2 {
  public:
    Bottom() 
    : MBase(5) // D1 and D2 default constructors are called implicitly.
    { 
    }
    const char* vf() const { return "Bottom"; }
};
int main(int argc,char **argv)
{
  Bottom b;
  return 0;
}

输出:

MBase::MBase(5)
MBase::MBase(1)

我认为你的问题与此类似...... 基本上,每个对象都有自己的 mBase 类的基本对象......

钻石传承

问候,埃瓦尔德