| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 693 人关注过本帖
标题:虚函数的问题
只看楼主 加入收藏
fcyvhk
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-7-14
结帖率:100%
收藏
 问题点数:0 回复次数:2 
虚函数的问题
首先是代码:
#include<iostream.h>
class A
{
    public:
      virtual ~A()
      {
      cout<<"调用~A()"<<endl;
      }
};
class B:public A
{
    char *buf;
    public:
    B(int i){buf=new char[i];}
    virtual ~B()
    {
        delete [] buf;
        cout<< "调用~B()"<<endl;
    }
};
void fun(A *pa)
{
    delete pa;
}
void main()
{
  A *pa=new B(10);
  fun(pa);
}

  运行出来的答案是
  调用~B()
  调用~A()
当把类A的virtual 去掉时  结果又变成了 调用~A()

我的问题:
1、未去掉类A的VIRTUAL时,程序的执行步骤是什么,为什么答案是 调用B后在调用A。

2、为什么去掉类A的virtual后,B就不需要析构了(书上解释是当不把基类的析构说明为虚函数时,delete隐含着对析构的调用,因此就不会调用其其类的析构函数了)对这段文字不是很明白,希望大家帮我解答下。
 谢谢
搜索更多相关主题的帖子: 函数 
2008-09-02 04:06
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
A 的指针指向B的对象
正常情况下只能调用A的成员
如果A的成员virtual做标记
如果B有重载则调用B的

本题就是当A的对象pa被删除时
要调用A析构函数而virtual做标记
故而调用了B的析构函数
而当对象被删除时必须调用本身的析构函数
因而有调用了A的析构函数

没有virtual做标记当然调用了A的析构函数

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-02 19:55
fcyvhk
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-7-14
收藏
得分:0 
[bo][un]ml232528[/un] 在 2008-9-2 19:55 的发言:[/bo]

A 的指针指向B的对象
正常情况下只能调用A的成员
如果A的成员virtual做标记
如果B有重载则调用B的

本题就是当A的对象pa被删除时
要调用A析构函数而virtual做标记
故而调用了B的析构函数
而当对象被删除时必 ...


恩,长了知识了,谢谢````
2008-09-02 21:16
快速回复:虚函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029499 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved