C++ 中的多重继承与 3 个派生 类
Multiple Inheritance in C++ with 3 derived classes
我正在尝试使用多重继承。 人是我的基地class。 Student 和 Angestellter 继承受保护的属性。 WissenschaftlicheHilfskraft 也应该继承这些属性(来自 Person、Student、Angestellter),但我不能在我最后派生的 class 中调用方法 get_name()。为什么?
#include <iostream>
using namespace std;
class Person {
protected:
string name;
public: //.......
string get_name() { name = "bob"; return name; }
};
class Student: public Person {
private: //......
public: //......
};
class Angestellte: public Person {
private: //......
public: //......
};
class WissenschaftlicheHilfskraft : public Student, public Angestellte
{
private: //......
public: //......
};
int main()
{
Person p;
cout << p.get_name() << endl; //WORKS
Student s;
cout << s.get_name() << endl; //WORKS
Angestellte a;
cout << a.get_name() << endl; //WORKS
WissenschaftlicheHilfskraft wh;
cout << wh.get_name() << endl; //DOESN'T WORK
return 0;
}
我希望它看起来像这样:
这是多重继承的经典 "diamond" 问题。您可以通过消除歧义来解决这个问题,例如变化:
cout << wh.get_name() << endl; //DOESN'T WORK
至:
cout << wh.Student::get_name() << endl; //WORKS
但是,请参阅 以获得正确解决潜在问题的更好解决方案。
此外,除了 Paul R 的回答之外,您的继承是错误的。您需要使用虚拟继承,如图所示 here.
class Student: public Person {
变成 class Student: public virtual Person {
等等。这样可以保证最后一个对象只创建一个base对象。
我正在尝试使用多重继承。 人是我的基地class。 Student 和 Angestellter 继承受保护的属性。 WissenschaftlicheHilfskraft 也应该继承这些属性(来自 Person、Student、Angestellter),但我不能在我最后派生的 class 中调用方法 get_name()。为什么?
#include <iostream>
using namespace std;
class Person {
protected:
string name;
public: //.......
string get_name() { name = "bob"; return name; }
};
class Student: public Person {
private: //......
public: //......
};
class Angestellte: public Person {
private: //......
public: //......
};
class WissenschaftlicheHilfskraft : public Student, public Angestellte
{
private: //......
public: //......
};
int main()
{
Person p;
cout << p.get_name() << endl; //WORKS
Student s;
cout << s.get_name() << endl; //WORKS
Angestellte a;
cout << a.get_name() << endl; //WORKS
WissenschaftlicheHilfskraft wh;
cout << wh.get_name() << endl; //DOESN'T WORK
return 0;
}
我希望它看起来像这样:
这是多重继承的经典 "diamond" 问题。您可以通过消除歧义来解决这个问题,例如变化:
cout << wh.get_name() << endl; //DOESN'T WORK
至:
cout << wh.Student::get_name() << endl; //WORKS
但是,请参阅
此外,除了 Paul R 的回答之外,您的继承是错误的。您需要使用虚拟继承,如图所示 here.
class Student: public Person {
变成 class Student: public virtual Person {
等等。这样可以保证最后一个对象只创建一个base对象。