假设我们有两个类:
class A:
{
A(int a); // c'tor
virtual ~A(); // d'tor
FirstMethod(...);
SecondMethod(...);
}
class B:public A
{
B(int a); // c'tor
~B(); // d'tor
FirstMethod(...);
SecondMethod(...);
}
两个类A和B具有完全相同的方法(相同的名称和参数,但不一定具有相同的功能)和成员,除了析构函数的名称和构造函数的名称,它们是不同的。 现在,假设我们有一个对象:
A* aObject = new A();
我们这样做:
B* bObject= dynamic_cast<B*>(aObject);
最后一次投射会成功还是bObject会为NULL?或者换句话说,程序能否区分A *类型的对象和B *类型的对象?
答案 0 :(得分:4)
最后一次投射会成功还是bObject会为NULL?
这将是NULL
。动态投射不会神奇地创建B
。如果您指向实际的B*
,它只会为您提供B
。在这里,您只有A
。
答案 1 :(得分:1)
动态转换将失败,但编译将首先失败。我知道你的意图,但我认为你正在尝试编写dynamic_cast(aObject)而不是尝试强制转换类型。这是编译失败。但是在纠正之后,动态转换仍然会失败,因为aObject不是B *类型(它没有通过is-a测试)。要使它起作用,B必须来自A。