请参考以下代码:
#define mPtr (static_cast<Dog*> (new(Animal)))
class Animal{
public:
virtual void talk(){cout<<"A";}
};
class Dog:public Animal{
int test;
public:
void talk(){bark();}
void bark(){
test=0;cout<<test;
}
};
int main() {
mPtr->talk();
mPtr->bark();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
A0
Run Code Online (Sandbox Code Playgroud)
基类talk()正在执行是有效还是未定义的行为?
这是直接未定义的行为.只有static_cast在100%确定指针指向该派生类的对象时,才能使用强制转换为派生类.dynamic_cast可以使用类层次结构中的安全转换.并且在这种情况下dynamic_cast<Dog*>(new Animal)将返回nullptr指示指向的对象不是Dog类.