为什么派生类可以两次调用基类构造函数?

时间:2019-12-14 00:04:38

标签: c++ inheritance multiple-inheritance diamond-problem

我正在学习多重继承和菱形问题,但是对于为什么可以在没有编译器错误的情况下调用基类构造函数两次而感到困惑。

来自https://www.geeksforgeeks.org/multiple-inheritance-in-c/

的示例
#include<iostream> 
using namespace std; 

class Person { 
   // Data members of person  
public: 
    Person(int x)  { cout << "Person::Person(int ) called" << endl;   } 
    int y;                                                               \\ <- I added this
}; 

class Faculty : public Person { 
   // data members of Faculty 
public: 
    Faculty(int x):Person(x)   { 
       cout<<"Faculty::Faculty(int ) called"<< endl; 
    } 
}; 

class Student : public Person { 
   // data members of Student 
public: 
    Student(int x):Person(x) { 
        cout<<"Student::Student(int ) called"<< endl; 
    } 
}; 

class TA : public Faculty, public Student  { 
public: 
    TA(int x):Student(x), Faculty(x)   { 
        cout<<"TA::TA(int ) called"<< endl; 
    } 
}; 

int main()  { 
    TA ta1(30); 
} 

输出:

Person::Person(int ) called
Faculty::Faculty(int ) called
Person::Person(int ) called
Student::Student(int ) called
TA::TA(int ) called

由于派生类TA调用了Person构造函数两次,这并不意味着TA将具有相同名称的两个数据成员副本,例如两个实例。 int y

3 个答案:

答案 0 :(得分:2)

从链接中提取内容具有误导性,它不是菱形,而是更多的Y:

  editSomething(element) {
      this.obj = this.dataSource.sortData(this.dataSource.filteredData,this.dataSource.sort).findIndex( obj => obj === element);
  }

是的,您有两个 ---------- ---------- | Person | | Person | ---------- ---------- ^ ^ | | ---------- ---------- | Student | | Faculty | ---------- ---------- ^ ^ | | \----- ----/ \ / | ---------- | TA | ---------- 成员的副本(PersonStudent::y)。

通过虚拟继承,您只有一个唯一的Faculty::y钻石。

答案 1 :(得分:0)

与其打印整数参数,不如尝试打印成员变量的地址。然后尝试使用虚拟继承,它应该可以更好地了解发生了什么。

std::cout << &y << std::endl;

答案 2 :(得分:0)

尝试调查实例化的TA对象的大小。尺码告诉你什么?对于单人副本,您期望什么尺寸?要两份?

尝试实际访问y属性,看看是否出现编译器错误!