【发布时间】:2016-11-09 06:18:08
【问题描述】:
我正在使用 C++。当我尝试将派生类的指针转换为基类时,编译器会抱怨“基类不明确”。
我做了一些研究,发现了这个问题How can I avoid the Diamond of Death when using multiple inheritance?。还有其他一些类似的问题。
有一个解决办法,就是使用virtual inheritance。但我无法更改类定义,因为它们是编译库。
是否可以在不更改基类定义的情况下进行转换?
一个最小的样本是:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
我想做的是:
D *d = new D;
A *a = (D *)d; // ambiguous
【问题讨论】:
-
您是如何设计出这样的设计的?正是因为这个原因,钻石继承是不受欢迎的。
-
这个问题是一个概念问题。您不只是以某种不透明、神奇的方式“转换指针”。您真正要做的是从更派生的对象中获取基本子对象的地址。一旦您意识到这一点,并且您可能有多个相同类型的基础子对象这一事实,解决方案就会变得清晰。
-
我正在维护一个古老的项目,无法修改基类。
-
如果你能提供一个说明问题的最小代码会更好
标签: c++