C++ 常见祖先问题。它是啥?

Posted

技术标签:

【中文标题】C++ 常见祖先问题。它是啥?【英文标题】:C++ Common Ancestor Problem. What is it?C++ 常见祖先问题。它是什么? 【发布时间】:2009-12-10 01:13:07 【问题描述】:

您好,我刚完成期末考试。有一个问题是“定义 C++ 中的共同祖先问题”,并说明使用该语言的什么特性来解决这个问题。

我不记得在课堂上学习过或听说过共同祖先问题。但是我写了以下内容:

我说这与继承有关。如果父类和子类使用相同的方法签名定义相同的方法。因此,例如,如果我有 Parent 类和 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 关键字并说

virtual void sayHeyllo()
.....
 

所以当我调用 p1.sayHello() 时,它会调用 Child 类而不是父类的方法。

这是正确的吗?我只是猜测,但它有点道理。我用谷歌搜索了 C++ 共同祖先问题,但没有出现任何问题。你知道我说的对吗?

谢谢。 T

【问题讨论】:

根据我的谷歌搜索,共同祖先问题也被称为“可怕的钻石继承”。这就是virtual 继承的用武之地。 【参考方案1】:

我认为他们的意思是继承钻石。当您有以下情况时:

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!

【讨论】:

【参考方案2】:

可能它指的是多重继承,其中几个基类有一个共同的父类(“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 ;

【讨论】:

【参考方案3】:

这实际上通常是指具有多重继承的Diamond Problem。

这里有一些detailed reference material on how C++ treats this。

【讨论】:

【参考方案4】:

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

您可以用来处理这个问题的 C++ 特性是虚拟继承:

class Foo : virtual public Bar


在 SO 中搜索钻石继承。

【讨论】:

以上是关于C++ 常见祖先问题。它是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Git 的常见反模式是啥? [关闭]

C++ 定义、声明和赋值到底是啥?

C++ 中的 _In_ 是啥?

使用 C++ 的 Google Cloud Speech API,第一步是啥?

C ++中不稳定错误的最常见原因是啥?

在 Visual C++ 中执行查询的最简单方法是啥