gpt4 book ai didi

c++ - 不向上转换为真正的基类

转载 作者:太空宇宙 更新时间:2023-11-04 15:32:19 25 4
gpt4 key购买 nike

我有点被糟糕的类层次结构所困扰。

class A {...}; // abstract
class B : public A {...}; // abstract
class C {...}; // abstract

class a1 : public B, public C {...}; // indirect inheritance of A
class c1 : public A, public C {...};

问题:是否可以将指向 C 的指针(引用)转换为指向类 A 的指针(引用)。

我知道最好的解决方案是只让类 C 继承自 A,但它仍然会导致类 a1(两个基数 A)出现一些问题。

最佳答案

The question: is it possible convert a pointer(reference) to C into pointer(reference) to class A.

除非类是多态的,即至少有一个虚拟成员函数。在这种情况下,dynamic_cast 可用于侧投,如 StoryTeller 的回答所示。

但是,如果 C 指针(引用)指向继承 A 的子指针,那么您可以先向下转换为该子指针,然后再转换为 A.

c1 c;
C& cref = c;
A& aref = static_cast<c1&>(cref);

这当然不一定是理想的,因为您不能只转换具体类型未知的任意 C 指针。

I understand that best solution is to make just class C inherited from A

如果这样做,那么所有 C 指针都可以隐式转换为 A 指针。

but still it can cause some problems with class a1 (two base A).

要解决这些问题,您需要共享基础,即虚拟继承。

struct A {}; // abstract
struct B : virtual A {}; // abstract
struct C : virtual A {}; // abstract

struct a1 : B, C {}; // indirect inheritance of A
struct c1 : C {};

int main() {
c1 c;
C& cref = c;
A& aref = cref;
}

关于c++ - 不向上转换为真正的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47592985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com