派生类遮掩基类方法的一些总结
2015-07-26 17:42
190 查看
参考:effective c++ 第三版 条款33 避免遮掩继承而来的名称。
首先说下覆盖和重载的概念. 参考: http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html
重载:指的是在同一个作用域内(这里提到了作用域scopes的概念,我的理解是函数或变量生效的范围),函数 名字相同,而参数个数或类型不同。 注意,重载与函数返回值无关。
覆盖:指的是子类重写或者隐藏基类的一些方法。这里的方法位于不同的作用域。 个人理解覆盖不是多态的一种,与有无virtual关键字无关。
class Base class Derived :public Base
{ {
void fun1(int, int ); void fun1();
virtual void fun2(); virtual void fun2();
virtual void fun2(int);
} ; } ;
如上所示,Derived继承了Base。当发生如下代码时,
Derived d;
int x;
int y;
d.fun1(); //right
d.fun1(x,y);// error 子类覆盖了父类中的fun1(int ,int ),当编译器看到这个函数时,首先在Derived的作用域内找, //并且找到了,但是参数不匹配,这时候编译器并不会继续扩大搜索范围,而是报错。
d.fun2(); //right
d.fun2(x); //error
如果必须使用父类的方法,而子类又要有自己的重写, 及想完成上面的调用。可以使用 using 声明式。
class Base class Derived :public Base
{ {
using Base::fun1; //让Base class 中的所有fun1 均在Derived作用域 //内可见
void fun1(int, int ); void fun1();
virtual void fun2(); virtual void fun2();
virtual void fun2(int);
} ; } ;
个人理解,从作用域这个角度理解覆盖的概念更加容易一些。
最后Scott Meyers 总结两点:
1.derived class 中的名称会遮掩base class 中的名称。
2. 为了让被遮掩的名称重见天日,可以使用using声明式或转交函数(具体参考effective c++)。
首先说下覆盖和重载的概念. 参考: http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html
重载:指的是在同一个作用域内(这里提到了作用域scopes的概念,我的理解是函数或变量生效的范围),函数 名字相同,而参数个数或类型不同。 注意,重载与函数返回值无关。
覆盖:指的是子类重写或者隐藏基类的一些方法。这里的方法位于不同的作用域。 个人理解覆盖不是多态的一种,与有无virtual关键字无关。
class Base class Derived :public Base
{ {
void fun1(int, int ); void fun1();
virtual void fun2(); virtual void fun2();
virtual void fun2(int);
} ; } ;
如上所示,Derived继承了Base。当发生如下代码时,
Derived d;
int x;
int y;
d.fun1(); //right
d.fun1(x,y);// error 子类覆盖了父类中的fun1(int ,int ),当编译器看到这个函数时,首先在Derived的作用域内找, //并且找到了,但是参数不匹配,这时候编译器并不会继续扩大搜索范围,而是报错。
d.fun2(); //right
d.fun2(x); //error
如果必须使用父类的方法,而子类又要有自己的重写, 及想完成上面的调用。可以使用 using 声明式。
class Base class Derived :public Base
{ {
using Base::fun1; //让Base class 中的所有fun1 均在Derived作用域 //内可见
void fun1(int, int ); void fun1();
virtual void fun2(); virtual void fun2();
virtual void fun2(int);
} ; } ;
个人理解,从作用域这个角度理解覆盖的概念更加容易一些。
最后Scott Meyers 总结两点:
1.derived class 中的名称会遮掩base class 中的名称。
2. 为了让被遮掩的名称重见天日,可以使用using声明式或转交函数(具体参考effective c++)。
相关文章推荐
- POJ 1797 Heavy Transportation
- Git中的文件状态和使用
- HDU 3062 Party
- Android学习相关
- CS281: Advanced Machine Learning 第一节
- Android Launcher之AppWidgets(一)
- win7 IIS7.5配置伪静态
- CentOS系统初始化
- Linux下编译、链接和装载
- [Effective Java]第十章 并发
- 研究spring原理的心得
- QTP工具介绍(一)()
- FPGA笔记-阅读.dat文件
- 关于Eclipse(MyEclipse)中一次性批量导入多个项目Project.
- Using native JSON
- android APP优化知识图谱
- Jedis 与 ShardedJedis 设计
- 044.@interface <>遵守正式协议
- Python中的re.search和re.findall之间的区别
- sqlserver2008 中使用MSXML2.ServerXMLHttp拼装soap调用webservice