嗨,我刚刚参加期末考试。有一个问题说,“在C ++中定义共同的祖先问题”,并说明该语言的哪些特性用于解决这个问题。
我不记得曾经在课堂上了解过共同的祖先问题,也没有听说过。但是我写了以下内容:
我说它与继承有关。如果父类和子类使用相同的方法签名定义相同的方法。例如,如果我有类Parent和class Child。
在班级家长我有
void sayHello(){
cout << "hello I'm a parent" <<endl;
}
然后在课堂上我有孩子
void sayHello(){
cout << "hello I'm a child" <<<endl;
}
然后,如果我有
Parent* p1;
Child* c1 = new Child();
p1 = & c1;
如果我致电p1.sayHello()
,我会从父类调用method sayHello()
,即使它与Child类型的实例有关。
为了解决这个问题,我们必须使用虚拟关键字并说出
virtual void sayHeyllo(){
.....
}
所以我调用p1.sayHello()它会调用Child类中的方法,而不是父类。
这是对的吗?我只是猜了一下,但这有点道理。我用谷歌搜索了C ++常见的祖先问题,但没有提出任何问题。你知道我是对的吗?
感谢。 Ť
答案 0 :(得分:4)
我认为他们的意思是继承钻石。如果您有以下内容:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {}; // here is the problem
D
中的问题是A
有两个副本来自B
,另一个来自C
。要解决此问题,您必须使用virtual inheritance
:
struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {}; // No problem!
答案 1 :(得分:4)
可能它指的是一个多重继承,其中几个基类有一个共同的父(“diamond inheritance”):
struct A {};
struct B1 : A {};
struct B2 : A {};
struct C : B1, B2 {};
要求的解决方案应该是虚拟继承:
struct A {};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct C : B1, B2 {};
答案 2 :(得分:3)
实际上,这通常是指具有多重继承的Diamond Problem。
答案 3 :(得分:3)
我原以为它指的是Diamond继承(http://en.wikipedia.org/wiki/Diamond_problem)
用于处理此问题的C ++功能是虚拟继承:
class Foo : virtual public Bar
{
}
搜索SO以获取钻石继承。