我正在使用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
答案 0 :(得分:3)
是否可以在不更改基类定义的情况下进行转换?
是的。您必须选择要经历的直接基类。
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
void foo(A&) {}
int main() {
D d;
foo(static_cast<B&>(d));
foo(static_cast<C&>(d));
return 0;
}
答案 1 :(得分:2)
我找到了一种方法来进行转换,虽然有点棘手。
以下代码可以完成这项工作:
A *a = (B *)d;