"virtual"我既爱你,又恨你!

csy_2002 2005-11-12 10:35:53
为什么要在~CBase()前面加virtual以后,才能调用 ~CChild()呢?
谁能帮我解释详细一点呢?
非常的感谢!!
class CBase
{
public:
CBase()
{
cout<<"CBase!"<<endl;
}
virtual ~CBase()///////////
{
cout<<"De CBase!"<<endl;
}
};

class CChild:public CBase
{

public:
CChild()
{
cout<<"CChild!"<<endl;
}
~CChild()/////////////////////////
{
cout<<"De CChild!"<<endl;
}
};
void main()
{
CBase *p;
p=new CChild;
delete p;
}
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
toumao 2005-11-13
  • 打赏
  • 举报
回复
工作中当然最好别这样写,
但是在函数调用的时候,这样做可以利用多态性来节约函数的。

比如:
void Function(CBase *p)
{
p->成员函数();
}

CChild *q = new Child();
Function(q);
ggw 2005-11-13
  • 打赏
  • 举报
回复
基类指针可以指向派生类,这是多态性的关键。
lengfeng281 2005-11-13
  • 打赏
  • 举报
回复
virtual 有个特性就是运行时确定
你编译的时候并不知道该调用哪个解析函数
只有到运行是遇到delete时它会去判断到底用哪个解析函数

c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的是,派生类的析构函数永远不会被调用。

这是《Effective c++》里的一段话
bombwang 2005-11-12
  • 打赏
  • 举报
回复
学习
Snow_Ice11111 2005-11-12
  • 打赏
  • 举报
回复
如果从学习研究的角度把代码写成你这样的话,那楼上windcsn(向所有的朋友学习!) 的正解。
工作中的话最好别这样写。
Snow_Ice11111 2005-11-12
  • 打赏
  • 举报
回复
CBase *p;
p=new CChild; //p到底是什么类型的指针,没见过这么定义的
----------------------------------------------------
你的代码我看了很不解,你说的地方virtual删去完全不影响程序。上面两行也应改成:
CBase *p;
p=new CBase;

或:
CChild *p;
p=new CChild;

后来我用上面改过的代码运行确实无误。
windcsn 2005-11-12
  • 打赏
  • 举报
回复
这是虚函数的特性,因为有虚表的存在。因为你使用CBASE类型的指针,你将这个指针POINT向一个CCHILD对象,没有问题,因为是BASE 类,所以按照类型转换是隐士的,但如果你在两个类中都有方法是,如果一般情况按照指针的类型来调用,而使用VIRTUAL是告诉计算机这个必须特殊处理,应该检查指针POINT的哪个对象的该函数,因此就出现你说的这种情况了。
没有什么奇怪,看一下C++的虚表部分。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧