收录日期:2021/02/27 20:21:05 时间:2016/07/13 20:55:46 标签:C++ 语言
哪位高手能帮我解释一下下面的代码啊!!!
#include<iostream.h>
class A
{
   public:
        virtual~A()
         {
            cout<<"A's~A()"<<endl;
          }
};
class B:public A
{
   char *buf;
   public:
     B(int i)
      {
         buf=new char[i];
       }
virtual~B(0
{
   delete[] buf;
   cout<<"B's~B()"<<endl;
}
};
void fun(A *a)
{
   delete a;
}
void main()
{
  A *a=new B(10)  ;
  fun(a);
}
虚析构 非 虚构造
 
构造函数不能为虚


此例为典型多态

1 函数为虚函数
2 使用基类的指针或引用指向派生类
引用 1 楼 operatingtuzi 的回复:
虚析构 非 虚构造

构造函数不能为虚


此例为典型多态

1 函数为虚函数
2 使用基类的指针或引用指向派生类

delete a; 会调用析构函数
你这是虚析构函数,不是虚构造函数。

#include <iostream.h> 
class A 

  public: 
        virtual~A() // 类A的析构函数
        { 
            cout < <"A's~A()" < <endl; 
        } 
}; 
class B:public A    // 类B继承类A

  char *buf;        // 声明一个字符指针
  public: 
    B(int i) 
      { 
        buf=new char[i];   // 在B的构造函数中动态分配i格char(及byte)的内存空间
      } 
virtual~B(0 

  delete[] buf;            // 回收在B的构造函数中动态分配i格char(及byte)的内存空间
  cout < <"B's~B()" < <endl; 

}; 
void fun(A *a) 

  delete a;    // 销毁指针a所指的对象

void main() 

  A *a=new B(10);    // 将类B对象的指针upcasting到类A的指针
  fun(a);            // 销毁指针a所指的对象
}


这样解释,如果还不是很清楚的话,请看:
虚析构函数问题:为什么要将基类的的析构函数设成虚的?
以前有朋友问过和你这个问题非常类似的问题。
析构函数是虚函数这里~
A *a=new B(10);//因为使用了指针所以发生了由于虚函数引起的多态
fun(a);        //这里将先调用基类的析构函数基类的资源,然后将调用派生类的析构函数析构派生类的资源
                 
引用 4 楼 liliangbao 的回复:
C/C++ code
析构函数是虚函数这里~
A *a=new B(10);//因为使用了指针所以发生了由于虚函数引起的多态
fun(a);        //这里将先调用基类的析构函数基类的资源,然后将调用派生类的析构函数析构派生类的资源


第一个注释不错,不过第二个有问题。
这个的delete a;首先调用的是子类的析构函数,最后调用基类的。
这就好比造房子。先造第一层,再造第二层。而拆房子时是要先拆第二层,再拆第一层。如果第一层先被拆掉的话,第二层不要砸在你头上吗?呵呵。

这里使用虚析构函数,主要就是为了实现多态,使得指向子类对象的a能够先调用子类的析构函数。
如果没有虚拟析构函数,那么这里将只调用基类的析构函数。

当调用虚函数时,它会根据指针实际指向的对象类型来调用函数,体现了多态性

如class A
  {
      virtual ~A();
  };
  class B:public A
  {
      virtual ~B();
  };
int main()
{
    A *a = new B(10);  //a指向的实际对象是B类型的
    delete a;          //会调用析构函数,由于a指向的类型,所以调用~B()

}
经典
非常好
可以

各位达人:请教如何获得pivottable的datapivotfield的作用范围 用jdbc连接本机sql server连不上,连远程sql server服务器却可以 如何创建一个指定编码的XML文件 怎么做插入符呀? 请问如何更改表单的大小 求助,MS sql能否改变插入数据的编码? sql 奇怪的连接问题,盼高手解答? ActiveX嵌入问题(请支持) 数据库脱机使用,求解决办法! 巨简单的问题 我想自学java啊,不知从何入门,请各位大哥大姐们指点迷津。感激涕零。。。 如何給TClientDataSet排序 请教greed游戏的UseCase设计 难以理解的问题? 高手帮我分析下面语句的意思 请问怎么用java关闭USB接口 求SQL 按月查询 如何实现两个DropDownList控件的值同步 这条SQL语句有什么错误呀! 同步数据库时间时,出现阻塞 用Python开发商业软件的疑问? 在C#中如何让各个窗体共享一个公共变量? 如何把在form1中combobox的值传递到form2中去,急!!!!! 这条sql语句有问题,请大家帮帮忙! C#中的RichTextBox怎样将光标自动跳转到指定的位置呢? 请教用jdbTable和QueryDataSet 增加数据时的验证问题! 都问圣诞节咋过?该咋过咋过,真当个事儿了都 简单问题,请高手帮忙!!!! sql server 2000 不能在 windows 2003 上面正常安装,且安装之后无法远程访问数据库