gpt4 book ai didi

c++ - "dreaded diamond"具有多态性

转载 作者:行者123 更新时间:2023-11-30 04:19:54 24 4
gpt4 key购买 nike

我有以下代码:

class Base
{
public:
virtual void doSomething() = 0;
};

class BaseImpl : public virtual Base
{
public:
virtual void doSomething() {
// something
}
};

class BaseDerived: public virtual Base
{
public:
virtual void doSomething2() = 0;
};

class BaseDerivedImpl: public BaseImpl, public BaseDerived
{
public:
virtual void doSomething2(){
// sonething2
}
};

然后我有

Base* b = new BaseImpl();
b->doSomething(); // fatal error at this line (not in the method, but in the method invocation)

问题是它甚至没有进入函数。

使用这样的层次结构有问题吗?

最佳答案

由于 OP 忽略了评论,所以让我在这里回答问题:

Is it something wrong with using such hierarchy?

不,没有错。这是解决“可怕的钻石”问题的标准方法(实际上并不是那么可怕)。

然而,在这个例子中钻石甚至没有出现:

Base* b = new BaseImpl();

BaseImpl 直接派生自 Base,因此您拥有标准的单一继承。您的代码的行为就像根本没有定义 BaseDerivedBaseDerivedImpl 一样。您可以将它们注释掉,应用程序仍然会崩溃。

然后您在此实例上调用 doSomething,它崩溃了。 doSomething的实现如下:

// something

因此,我的结论是 //something 会导致崩溃,但如果不查看该方法的实现就无法判断。

关于c++ - "dreaded diamond"具有多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15525052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com