将派生类指针转换为基类时,基类不明确

时间:2016-11-09 06:18:09

标签: c++

我正在使用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

2 个答案:

答案 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;