一、父类指针指向子类对象
首先,来看一段代码:
//用父类指针指向子类对象
class A {
public:
A() { printf("A \n"); }
~A() { printf(" ~A \n"); } // 这里不管写不写virtual,删除B对象的时候,都会被执行。因为这个例子是B*指针指向B对象,不是A*指针指向B对象。
};
class B : public A
{
public:
B() { printf("B \n"); }
~B() { printf("~B \n"); }
};
int main(int argc, char* argv[])
{
B* b = new B;
delete b;
return 0;
}
int main(int argc, char* argv[])
{
B b; // 虽然正确,但其实是非正常情况,因为你防不住程序员定义A* a = new B(); 这样就错了。
return 0;
}
执行结果:
A
B
~B
~A
结论:删除子类指针,无论如何会自动调用祖先类的析构函数(即使祖先类的习惯函数不是虚拟的),虽然这是非正常情况,但还是记一下。
第二段代码:
class A {
public:
A() { printf("A \n"); }
virtual ~A() { printf(" ~A \n"); } // 增加了虚拟关键字
};
class B : public A
{
public:
B() { printf("B \n"); }
~B() { pri