【发布时间】:2020-10-14 20:01:55
【问题描述】:
我对两个版本的代码有一个问题。 唯一不同的是在父类之间切换 virtual 关键字。 发生这种情况有什么原因吗?
版本一:
#include<iostream>
using namespace std;
class Person {
public:
Person(int x) { cout << "Person::Person(int ) called" << endl; }
Person() { cout << "Person::Person() called" << endl; }
};
class Faculty : public Person {
public:
Faculty(int x):Person(x) {
cout<<"Faculty::Faculty(int ) called"<< endl;
}
};
class Student : virtual public Person {
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), Person(x) {
cout<<"TA::TA(int ) called"<< endl;
}
};
int main() {
TA ta1(30);
}
版本的输出:
Person::Person(int) 被调用
Person::Person(int) 被调用
Faculty::Faculty(int) 调用
Student::Student(int) 调用
TA::TA(int) 调用
第二版:
#include<iostream>
using namespace std;
class Person {
public:
Person(int x) { cout << "Person::Person(int ) called" << endl; }
Person() { cout << "Person::Person() called" << endl; }
};
class Faculty : virtual public Person {
public:
Faculty(int x):Person(x) {
cout<<"Faculty::Faculty(int ) called"<< endl;
}
};
class Student : public Person {
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), Person(x) {
cout<<"TA::TA(int ) called"<< endl;
}
};
int main() {
TA ta1(30);
}
输出是:
Person::Person(int) 被调用
Faculty::Faculty(int) 调用
Person::Person(int) 被调用
Student::Student(int) 调用
TA::TA(int) 调用
【问题讨论】:
-
附带问题:
Faculty实体与Person实体有关系“IS A”吗? -
首先初始化虚拟基类。所以,是的,添加
virtual关键字确实会影响初始化顺序。从Person继承一次有虚拟继承,一次没有仍然意味着有两个不同的Person类型的基,但每次都会首先初始化虚拟的。
标签: c++ inheritance multiple-inheritance virtual-inheritance