c++笔记 遮掩继承
来源:互联网 发布:电子商务网站源码下载 编辑:程序博客网 时间:2024/04/29 08:16
看一个例子:
class Base {public:virtual void mf1() = 0;virtual void mf1(int){}virtual void mf2(){}void mf3(){}void mf3(double){}};class Derived: public Base {public:virtual void mf1(){}void mf3(){}void mf4(){}};这段代码带来的行为会让每一位第一次面对它的c++程序员大吃一惊,base class 内所有名为mf1各mf3的函数都被derived class内的mf1和mf3函数遮掩掉了。从名称查找观点来看,Base::mf1和Base::mf3不再被Derived继承!
Derived d;int x;d.mf1();d.mf1(x);//错误!因为Derived::mf3遮掩了Base::mf1d.mf2();d.mf3();d.mf3(x);//错误!因为Derived::mf3遮掩了Base::mf3
上述行为违反base和derived class之间的is-a关系,因此你几乎总会要推翻c++对“继承而来的名称”的缺省遮掩行为。可以使用using声明式达成目标:
class Derived: public Base {public:using Base::mf1;//让Base class内名为mf1和mf3的using Base::mf3;//所有东西在Derived作用域内都可见virtual void mf1(){}void mf3(){}void mf4(){}};
注:
以c++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味着“is-a”(是一种)的关系。
- c++笔记 遮掩继承
- 《Effective C++》学习笔记条款33 避免遮掩继承而来的名称
- 继承与遮掩问题
- 继承中的函数名称遮掩
- 《Effective C++》读书笔记之item33:避免遮掩继承而来的名称
- Effective C++:条款33:避免遮掩继承而来的名称
- 避免遮掩继承而来的名称(Effective C++_33)
- 读书笔记《Effective C++》条款33:避免遮掩继承而来的名称
- C++之避免遮掩继承而来的名称(33)---《Effective C++》
- [effectiv c++]条款33:避免遮掩继承而来的名称(重载,重写,重定义)
- 避免遮掩继承而来的名称——effective c++学习笔记
- 避免遮掩继承而来的名称
- 避免遮掩继承而来的名称
- 避免遮掩继承而来的名称
- 《Effective C++ 》学习笔记-第六章 条款33:避免遮掩继承而来的名称 Avoid hiding inherited names
- 继承:避免遮掩继承而来的名称
- 【笔记-C++】 继承
- 条款33:避免遮掩继承而来的名称
- Linux下core文件调试方法
- html基础知识
- 在二元树中找出和为某一值的所有路径
- 两点是否在一条直线上--Java编写---点是否在三角行内
- 关于 contact aggregation & lookup uri
- c++笔记 遮掩继承
- SRM540-div2-3-FractionInDifferentBases
- struts2整合spring 时web.xml的配置
- 进程、轻量级进程(LWP)、线程
- 拷贝构造函数
- 我的时间管理——幸福密码
- 道听途说Struts2之19:OGNL访问静态方法,集合类
- SQL Server 2005 Service Broker 初探
- 进阶