gpt4 book ai didi

c++ - 转换为多重继承

转载 作者:行者123 更新时间:2023-11-28 07:15:15 25 4
gpt4 key购买 nike

我想知道是否可以在不知道其初始类型的情况下将一个对象转换为它继承自的多个类。例如,假设我有以下结构:

struct A {
int a;
};

struct B {
int b;
};

struct C {
int c;
};

struct D {
int d;
};

struct Z : A, B, C, D {};

然后我将 Z 的实例添加到 vector 中。

vector<A *> v;
Z *zed = new Z();
v.push_back(zed);

现在假设我知道 vector 中的第一个元素继承自 A 和 B,我想将其转换为 A 和 B。

struct Tmp : A, B {};
Tmp *tmp = static_cast<Tmp *>(v[0]);
tmp->b = 6;
cout << zed->b << endl;

但是,这样做会导致问题。主要是如果 Z 被定义为 struct Z : A, C, D, B {};然后cout << zed->b << endl;会打印 0 而不是 6。你会如何解决这个问题?

我知道这样做可能不安全,而且设计可能很差,但是,我仍然想知道这是否可行。

最佳答案

您可以使用dynamic_cast 来“跨越”继承层次。但是“from”类型中至少需要有一个虚函数,并且不能从虚函数或多重继承的基类中进行转换。

struct A {
int a;
virtual ~A() {}
};

struct Z : A, B, C, D {};
vector<A *> v;
Z *zed = new Z();
v.push_back(zed);

B *tmp = dynamic_cast<B *>(v[0]);

如果 v[0] 毕竟不是从 B 派生的,这将使用运行时类型检查并产生 nullptr

至于 struct Tmp,尽管有共同的基础,但根据语言,它与 Z 完全无关。如果 Tmp 也声明了它自己的成员呢?如果您想访问 BC 子对象,而不管它们是如何继承的,请使用两个单独的 dynamic_cast 操作获取引用。

关于c++ - 转换为多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342673/

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