C++ C++;删除类指针&;多态性

C++ C++;删除类指针&;多态性,c++,pointers,polymorphism,C++,Pointers,Polymorphism,我正在学习多态性,这是我偶然发现的。我找不到满意的答案,测试下面的代码并没有产生预期的结果 #include <stdio.h> #include <iostream> class Base { public: Base(){ std::cout<<"Constructing Base" << std::endl; }; virtual int get_a(){

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

#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;
}
我明白为什么我得到了第1-4行,basePtr是指向派生的指针,它继承自Base,后者实现了虚拟函数

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

我的2。期望值:我期望派生的值p_a(p_a=2)出现在输出上,因为basePtr存储派生的指针


有人能纠正我的想法吗?

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

delete basePtr;
这会破坏对象

basePtr->check();

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

这就是为什么最好始终将刚删除的指针设置为nullptr。指针basePtr应该无法传递函数调用->check(),--为什么不?你的代码是这样写的,事情就是这样。如果你告诉C++做某事,它会做到,不管你要求它做什么,都可能需要不好的结果。这就是为什么你根本不使用C++中的指针的原因。具有自动存储持续时间的对象非常棒,包括智能指针类型,如
std::unique_ptr
@IInspectable是的,你是对的,没有一个专业库/C++API使用过指针,所以是的,你永远不必使用它们。
basePtr->check();