码迷,mamicode.com
首页 > 其他好文 > 详细

用父类指针指向子类对象

时间:2016-11-22 02:38:44      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:public   let   printf   习惯   --   子类   turn   自动   argc   

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() { printf("~B \n"); }
};

int main(int argc, char* argv[])
{
A* a = new B;

delete a;
return 0;
}
执行结果(正常情况,子类祖先类的析构函数都是虚拟的,这样删除祖先类指针、子类对象的时候,可正确同时调用子类和祖先类的析构函数):
A
B
~B
~A
但是如果去掉 virtual(这里是A*指针指向B对象),改一下立刻有效果,变成了错误(错误情况)。
执行结果:
A
B
~A

总结:自己类型的指针指向自己的对象,怎么样都没有问题(不管父类析构函数写不写virtual)。只有基类指针指向子类对象的时候,一定需要virtual关键字的配合,才能正确的工作

用父类指针指向子类对象

标签:public   let   printf   习惯   --   子类   turn   自动   argc   

原文地址:http://www.cnblogs.com/yyx1-1/p/6087440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!