强制转换为多重继承
Cast to multiple inheritance
我想知道是否可以在不知道其初始类型的情况下将对象强制转换为它继承的多个类。例如,假设我有以下结构:
struct A {
int a;
};
struct B {
int b;
};
struct C {
int c;
};
struct D {
int d;
};
struct Z : A, B, C, D {};
我将Z的实例添加到向量中。
vector<A *> v;
Z *zed = new Z();
v.push_back(zed);
现在假设我知道向量中的第一个元素继承自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
也声明了自己的成员呢?如果希望访问B
和C
子对象,而不管它们是如何继承的,请使用两个单独的dynamic_cast
操作获取引用。
您似乎不止一次使用A
和B
(用于强制转换和创建Tmp
结构。我建议您为struct X : A, B {...}
命名一个有用的名称,并将Z
定义为:struct Z : X, C, D {}
。
然后演员阵容变为:
X* tmp = static_cast<X*>(v[0]);
tmp->b = 6;
std::cout << zed->b << std::endl;
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- C++ MSVC 中的访问冲突,但不在 GCC 中进行多重继承和强制转换
- 在多重继承场景中动态强制转换类型
- 将void*强制转换为具有多重继承的类
- 多重继承强制转换未按预期工作
- c++多重继承强制转换是如何工作的
- C++ 从接口和强制转换的多重继承
- 虚拟多重继承和强制转换
- 强制转换为多重继承
- C++ 中的多重继承转换
- 多重继承c++,如何进行类型转换
- c++中具有多重继承的强制转换
- 多重继承和强制类型转换
- 当使用多重继承时,静态强制转换是安全的
- 从基类到不同派生类的多重继承强制转换
- 将我的c++代码转换为Java:转换多重继承
- 如何使用多重继承执行强制转换