【发布时间】:2016-10-18 07:40:13
【问题描述】:
我最近遇到了转换和多重继承的问题:我需要将Base* 转换为Unrelated*,因为特定的Derived 类派生了Unrelated 类。
这是一个简短的例子:
#include <iostream>
struct Base{
virtual ~Base() = default;
};
struct Unrelated{
float test = 111;
};
struct Derived : Base,Unrelated{};
int main(){
Base* b = new Derived;
Unrelated* u1 = (Unrelated*)b;
std::cout << u1->test << std::endl; //outputs garbage
Unrelated* y = dynamic_cast<Unrelated*>(b);
std::cout << y->test << std::endl; //outputs 111
}
第一个演员显然不起作用,但第二个演员确实起作用了。
我的问题是:为什么第二个演员起作用了? dynamic_cast 不应该只适用于转换为相关的类类型吗?我认为在运行时没有关于 Unrelated 的任何信息,因为它不是多态的。
编辑:我使用 colirus gcc 作为示例。
【问题讨论】:
-
您在 b 中保留指向 Derived 实例的指针,并将其转换为您继承的 Unrelated。有什么问题?
-
Unrelated是Derived的基数,而您正在从Derived*向上转换为Unrelated*,这就是它有效的原因。 -
呃。 C 风格的演员表。不要使用它们。改用正确的 C++ 风格转换 - 总是。
标签: c++ multiple-inheritance dynamic-cast reinterpret-cast