C ++共同祖先问题。它是什么?

时间:2009-12-10 01:13:07

标签: c++ inheritance

嗨,我刚刚参加期末考试。有一个问题说,“在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 ++常见的祖先问题,但没有提出任何问题。你知道我是对的吗?

感谢。 Ť

4 个答案:

答案 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

这是一些detailed reference material on how C++ treats this

答案 3 :(得分:3)

我原以为它指的是Diamond继承(http://en.wikipedia.org/wiki/Diamond_problem

用于处理此问题的C ++功能是虚拟继承:

class Foo : virtual public Bar
{
}

搜索SO以获取钻石继承。