关于重写和重定义



重写、重定义和继承完全是两个概念,比如析构函数:能被派生类重写,来实现多态,可以方便的用指向基类的指针释放派生类的对象,不能被继承,因为举个例子,派生类和基类有不同的成员,如果基类的默认析构函数是从基类继承的话,那么派生类在析构时就有内存空间不能被释放的问题存在了,所以析构函数是不能被继承的。

“继承”是一整套的机制,是对类而言的。对一个成员函数说能否被继承,容易引起语言上的概念混淆(至少各人的理解不同)。所以,这里就列举析构函数与普通函数的异同,至于能不能“继承”,请先回答什么叫一个成员函数的继承,然后可以对照这里的内容得出答案。
首先,析构函数和普通函数一样,可以被显示地调用。如类D公有继承类B,它们的析构函数也都是公有的。那么下述代码是合法的:
B b;
b.~B();
D d;
d.B::~B();
从中可以看出,对B的对象而言,~B与其他函数在调用并不差异,而对D的对象而言,B::~B与其他函数也没有差异。由此可见,继承类的对象调用基类的析构函数,与调用其他基类的函数规则一样。但是注意了,这里的调用只是它由用户显示写出的函数体,而不包括在对象销毁时由编译器插入的其他操作。

其次,子类不能覆盖(Override)父类的析构函数,这是和普通函数的区别。D中不能再命名~B了。

第三,涉及多态的特殊规则:对一个类层次而言,虽然~B和~D是不同名的函数,但是在多态意义上是同一个函数。因此,virtual ~B意味指向D对象的B指针(或引用)在析构时将调用~D。所有的函数中,这是唯一的特例。这是析构函数的特殊性与多态机制结合的产物。

最后,说一下析构函数的特殊性。正如大家所知道了,析构函数会在对象销毁时被隐式调用。并且,执行完用户编写的代码部分后,它还会依次调用数据成员和基类的析构函数(以与构造相反的顺序)。在这一点上,它和构造函数一样特殊。

综上,子类对象可以显式调用的(如果称之为“继承”的话),只有由类设计者显式编写的父类析构函数的函数体而已,而不是真正只有编译器可以调用的整个析构函数!C++的这个特性,提供程序员随时显式清理对象数据的能力,而同时又不威胁默认的析构语义。同时,即使是函数体,也只能被调用,不能被覆盖。相反,多态则是作用在整个析构函数上的,而非函数体上。C++提供如此与普通函数、与构造函数有一些相同、又都有些不同的析构函数“继承”规则,就是为了最大限度地赋予程序员使用和控制对象析构机制的能力,这是其它许多语言所无法做到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值