注册 登录
编程论坛 C++教室

虚函数的问题

fcyvhk 发布于 2008-09-02 04:06, 693 次点击
首先是代码:
#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隐含着对析构的调用,因此就不会调用其其类的析构函数了)对这段文字不是很明白,希望大家帮我解答下。
 谢谢
2 回复
#2
ml2325282008-09-02 19:55
A 的指针指向B的对象
正常情况下只能调用A的成员
如果A的成员virtual做标记
如果B有重载则调用B的

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

没有virtual做标记当然调用了A的析构函数
#3
fcyvhk2008-09-02 21:16
[bo][un]ml232528[/un] 在 2008-9-2 19:55 的发言:[/bo]

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

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


恩,长了知识了,谢谢````
1