我正在尝试使用多重继承。 Person 是我的基类。 学生和 Angestellter 继承受保护的属性。 WissenschaftlicheHilfskraft 也应该继承这些属性(来自Person,Student,Angestellter),但我不能在我的上一个派生类中调用方法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;
}
答案 0 :(得分:2)
这是具有多重继承的经典“钻石”问题。您可以通过消除歧义来解决此问题,例如:改变:
cout << wh.get_name() << endl; //DOESN'T WORK
为:
cout << wh.Student::get_name() << endl; //WORKS
但是,请参阅@Shiv's answer以获得更好的解决方案,以便妥善解决潜在问题。
答案 1 :(得分:2)
另外,除了Paul R的回答,你的继承是错误的。您需要使用虚拟继承,如图所示here。
class Student: public Person {
变为class Student: public virtual Person {
,依此类推。这样可以确保只为最终对象创建一个base对象。