在将派生类指针转换为基类时,基类有歧义

base class ambiguous when converting derived class pointer to base class

本文关键字:基类 歧义 转换 派生 指针      更新时间:2023-10-16

我用的是c++。当我尝试转换派生类的"指针到基类"时,编译器抱怨"基类是模糊的"。

我做了一些研究,发现了这个问题,我如何在使用多重继承时避免死亡之钻?和其他一些类似的问题。

有一个解决方案,就是使用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

是否可以在不改变基类定义的情况下进行转换?

是的。您必须选择要通过哪个直接基类。

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;
}

我找到了一种方法来进行这种转换,尽管有点棘手。

下面的代码可以完成这项工作:

A *a = (B *)d;