C ++删除一个类指针&多态性

时间:2016-09-24 14:43:37

标签: c++ pointers polymorphism

我正在学习多态性,这是我偶然发现的。我找不到令人满意的答案,并且测试以下代码不会产生预期的结果。

#include <stdio.h>
#include <iostream>

class Base {
    public:
        Base(){
            std::cout<<"Constructing Base" << std::endl;
        };
        virtual int get_a(){
            return p_a;
        };
        virtual int check(){
            std::cout<<"check Base" << std::endl; return 2;
        };
        virtual ~Base(){
            std::cout<<"Destroying Base" << std::endl;
        };
        int p_a = 4;
};

class Derive: public Base {
    public:
        Derive(){
            std::cout<<"Constructing Derive" << std::endl;
        };
        int get_a(){
            return p_a;
        };
        int check(){
            std::cout<<"check Derive" << std::endl;
            return 3;
        };
        ~Derive(){ std::cout<<"Destroying Derive" << std::endl; };
        int p_a = 2;
 };

int main() {
        Base *basePtr = new Derive();
        delete basePtr;
        basePtr->check();
        std::cout << "p_a: " << basePtr->get_a() << std::endl;
        return 1;
}

控制台输出:

Constructing Base    // line 1
Constructing Derive  // line 2
Destroying Derive    // line 3
Destroying Base      // line 4
check Base           // line 5
p_a: 4               // line 6

我明白为什么我得到第1-4行,basePtr是Derive的指针,它继承自Base,它实现了虚函数。

我的1.期望:在调用 delete 之后,指针basePtr应该不能传递函数调用 - &gt; check(),并且也应该没有值p_a。

我的2.期望:我希望Derive(p_a = 2)中的值 p_a 出现在输出上,因为basePtr存储了Derive的指针。

有人可以纠正我的想法吗?

1 个答案:

答案 0 :(得分:2)

这是未定义的行为。无论你得到什么结果,都是无效的。

delete basePtr;

这会破坏物体。

basePtr->check();

在销毁对象之后,显示的代码尝试取消引用指向被破坏的类实例的指针,并调用被破坏对象的方法。调用被破坏对象的方法是未定义的行为。