菱形多重继承图案

diamond shaped multiple inheritance pattern

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

下面是多重继承中面临的钻石问题,

class Base {
 public:
  Base() {
    cout << "Empty Base constructor " << endl; 
  }
  Base(const string & strVar) { 
    m_strVar = strVar; 
    cout << m_strVar << endl;
  }
  virtual ~Base() {
    cout << "Empty Base destructor " << endl;
  }
  virtual const string & strVar() const { 
   return m_strVar; 
  }
  string m_strVar;
};
class Derived1: public virtual Base {
 public:
  Derived1() {
    cout << "Empty Derived1 constructor " << endl; 
  }
  Derived1(const string & strVar) : Base(strVar) {
    cout << " Derived1 one arg constructor" << endl;
  }
  ~Derived1() {
    cout << "Empty Derived1 destructor " << endl;
  }
};
class Derived2: public virtual Base {
 public:
  Derived2() {
    cout << "Empty Derived2 constructor " << endl; 
  }
  Derived2(const string & strVar) : Base(strVar) {
    cout << "Derived2 one arg constructor" << endl;
  }
  ~Derived2() {
    cout << "Empty Derived2 destructor " << endl;
  }
};
class Derived: public Derived1, public Derived2 {
 public:
  Derived(const string & strVar) : Derived1(strVar), Derived2(strVar) {
    cout << "Derived Constructor " << endl; 
  }
  ~Derived() {
    cout << "Empty Derived destructor " << endl;
  }
};
int main() {
  Derived derObj ("Print this if you can ! "); 
}

我得到的输出是

  1. 空基构造函数
  2. 派生2一个arg构造函数
  3. 派生1一个arg构造函数
  4. 派生构造函数
  5. 空派生析构函数
  6. 空的Derived2析构函数
  7. 空的Derived1析构函数
  8. 空基析构函数

我想知道为什么我的derObj参数,即"如果可以的话打印这个"没有打印出来,并且输出不像

  1. 空基构造函数
  2. 派生2一个arg构造函数
  3. 如果可以的话,打印一下
  4. 派生1一个arg构造函数
  5. 派生构造函数
  6. 空派生析构函数
  7. 空的Derived2析构函数
  8. 空的Derived1析构函数
  9. 空基析构函数

这与虚拟继承有关。

当一个类以虚拟方式继承时,层次结构中最派生的有责任调用其构造函数:此处为Derived

由于Base是默认可构造的,并且您没有精确计算任何内容,因此Derived调用Base的默认构造函数。

如果要打印字符串,请使用:

Derived(const string & strVar) : Base(strVar), Derived1(strVar), Derived2(strVar)
{
  std::cout << "Derived Constructorn"; 
}

您可以删除默认构造函数,让编译器诊断问题,尽管并非所有编译器都会给出非常有用的消息。