我正在学习多态性,这是我偶然发现的。我找不到令人满意的答案,并且测试以下代码不会产生预期的结果。
#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的指针。
有人可以纠正我的想法吗?
答案 0 :(得分:2)
这是未定义的行为。无论你得到什么结果,都是无效的。
delete basePtr;
这会破坏物体。
basePtr->check();
在销毁对象之后,显示的代码尝试取消引用指向被破坏的类实例的指针,并调用被破坏对象的方法。调用被破坏对象的方法是未定义的行为。