将派生类指针转换为基类时基类不明确 我使用C++。当我试图转换派生类“指向基类的指针”时,编译器会抱怨“基类不明确”

将派生类指针转换为基类时基类不明确 我使用C++。当我试图转换派生类“指向基类的指针”时,编译器会抱怨“基类不明确”,c++,C++,我做了一些研究,发现了这个问题。还有一些类似的问题 有一个解决方案,就是使用虚拟继承。但我无法更改类定义,因为它们是编译库 在不更改基类定义的情况下,是否可以进行转换 最低限度的样本是: 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 {};
我想做的是:

D *d = new D;
A *a = (D *)d;  // ambiguous

我找到了一种转换的方法,虽然有点棘手

以下代码将完成此工作:

A *a = (B *)d;
在不更改基类定义的情况下,是否可以进行转换

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

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类{};
B类:公共A{};
C类:公共A{};
D类:公共B、公共C{};
void foo(A&){}
int main(){
D;
foo(静态)(d);;
foo(静态)(d);;
返回0;
}

你是如何得到这样的设计的?钻石继承正是因为这个原因而受到反对。这个问题是一个概念上的问题。你不只是以某种不透明、神奇的方式“转换指针”。您真正要做的是从更派生的对象获取基子对象的地址。一旦您意识到这一点,并且您可能有多个相同类型的基子对象,解决方案就会变得清晰。我正在维护一个古老的项目,这使得修改基类变得不可能。如果您提供一个说明problem@MartinZhai,很高兴我帮了忙。我想这应该是个答案。但是说真的,看看是否可以更新基类。你可能会对更好的解决方案感到惊讶。那将是一个更好的解决方案,而这个解决方案现在已经足够好了。”(B*)d“你能解释一下吗?我知道“*B”是什么意思,但这是confusing@imtithal这是为了先将
d
显式转换为
B
的指针。然后编译器将把
B
的指针隐式转换为
A
的指针(不再含糊不清,因为
B
只有一个父类)。