我们在上一篇的时候引入了一个问题:当不为我们的子类显式提供操作符重载函数实现,那么编译器为这个
类提供的操作符重载的默认实现版本是否会调用基类的操作符实现函数呢?带着这个问题,我们依旧利用上一篇
的代码进行测试,我们先注释掉该子类的操作符实现函数:
class Day:public LimitValue{
public:
Day(int days,int selfData):LimitValue(days),selfValue_(selfData){}
// Day& operator=(const Day& rhs){
// cout<<"In Day,call operator=(const Day&) "<<endl;
// selfValue_ = rhs.selfValue_;
// return *this;
// }
int getSelfValue()const{
return selfValue_;
}
private:
int selfValue_;
};
测试代码我们原封不动,输出结果如下:
// Before assign,d1:value_=1 selfValue=1
// d2:value_=2 selfValue=2
// In LimitValue,call operator=()
// After assign,d1:value_=1 selfValue=1
// d2:value_=1 selfValue=1
wow,看来运行结果依然良好!它调用了基类的操作符实现体,显然符合我们的一般规律,呵呵,好了,我们现在
在前一篇的结论基础了在进行完善一下:
(1)如果你显式地实现子类的操作运算符函数,那么在你的实现体内你需要实现其父类该操作的功能.因为此
时的编译器不会为你自动调用父类相应的操作符函数.
(2)如果你没有声明子类的操作运算符函数,那么当某地方用到该类的操作符时,编译器会自动为该类生成其
默认的操作符函数实现版本,该实现版本内部会自动调用该类父类的操作符函数(当然如果父类没有提供明确声明
那么它将调用编译器父类该操作符的默认实现版本).
关于继承体系下的操作符重载问题讨论(二)
最新推荐文章于 2024-09-27 20:40:55 发布