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++ 常见祖先问题。它是啥?的主要内容,如果未能解决你的问题,请参考以下文章