将派生类指针转换为基类时基类不明确 我使用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
只有一个父类)。