我有以下类层次结构:
class IControl
{
virtual void SomeMethod() = 0; // Just to make IControl polymorphic.
};
class ControlBase
{
public:
virtual int GetType() = 0;
};
class ControlImpl : public ControlBase, public IControl
{
public:
virtual void SomeMethod() { }
virtual int GetType()
{
return 1;
}
};
我有一个IControl抽象类和一个ControlBase类。ControlBase 类不继承自 IControl,但我知道每个 IControl 实现都将派生自 ControlBase。
我有以下测试代码,其中我使用dynamic_cast以及C 风格的强制转换对ControlBase的IControl引用(因为我知道它派生自它):
int main()
{
ControlImpl stb;
IControl& control = stb;
ControlBase& testCB1 = dynamic_cast<ControlBase&>(control);
ControlBase& testCB2 = (ControlBase&)control;
ControlBase* testCB3 = (ControlBase*)&control;
std::cout << &testCB1 << std::endl;
std::cout << &testCB2 << std::endl;
std::cout << testCB3 << std::endl;
std::cout << std::endl;
std::cout << testCB1.GetType() << std::endl; // This properly prints "1".
std::cout << testCB2.GetType() << std::endl; // This prints some random number.
std::cout << testCB3->GetType() << std::endl; // This prints some random number.
}
只有 dynamic_cast 正常工作,其他两个转换返回的内存地址略有不同,GetType() 函数返回不正确的值。
这样做的确切原因是什么?C 风格的演员表最终会使用reinterpret_cast吗?它与多态对象在内存中的对齐方式有关吗?