首页 > 代码库 > c++ 子类切勿重新定义父类 non-virtual函数
c++ 子类切勿重新定义父类 non-virtual函数
子类如果重新定义了父类的non-virtual函数则不会有多态效果。
为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!
1:子类直接继承父类方法
class BaseOption{public: void Function();};void BaseOption::Function(){ cout<<"BaseOption::Function()"<<endl;}class SubOption : public BaseOption{};int _tmain(int argc, _TCHAR* argv[]){ SubOption obj; BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}
输出:
"BaseOption::Function()"
"BaseOption::Function()"
这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();
2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现
class BaseOption{public: virtual void Function();};void BaseOption::Function(){ cout<<"BaseOption::Function()"<<endl;}class SubOption : public BaseOption{public: void Function();};void SubOption::Function(){ cout<<"SubOption::Function()"<<endl;}int _tmain(int argc, _TCHAR* argv[]){ SubOption obj; BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}
这就是我们常说的多态。
输出:
"SubOption::Function()"
"SubOption::Function()"
3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。
class BaseOption{public: void Function();};void BaseOption::Function(){ cout<<"BaseOption::Function()"<<endl;}class SubOption : public BaseOption{public: void Function();};void SubOption::Function(){ cout<<"SubOption::Function()"<<endl;}int _tmain(int argc, _TCHAR* argv[]){ SubOption obj; BaseOption *pBase = &obj; SubOption *pSub = &obj; pBase->Function(); pSub->Function();}
输出:
BaseOption::Function()
SubOption::Function()
虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。