具有基类属性是否有效,即使在完成向下转换时它是虚拟的

cea*_*sif 0 c++ oop c++11

请参考以下代码:

#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()正在执行是有效还是未定义的行为?

use*_*670 6

这是直接未定义的行为.只有static_cast在100%确定指针指向该派生类的对象时,才能使用强制转换为派生类.dynamic_cast可以使用类层次结构中的安全转换.并且在这种情况下dynamic_cast<Dog*>(new Animal)将返回nullptr指示指向的对象不是Dog类.