#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 使用基类的指针或引用指向派生类
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); //这里将先调用基类的析构函数基类的资源,然后将调用派生类的析构函数析构派生类的资源
第一个注释不错,不过第二个有问题。
这个的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 上面正常安装,且安装之后无法远程访问数据库