C++的继承与名字覆盖
2010-06-20 15:40
232 查看
先看个例子。
然后执行如下调用:
为什么会出错呢?子类不是可以访问父类的成员吗?看看下面这个也许就明白了。
虽然类型不一样,但在f函数内部使用的是函数内部作用域的变量x。类也是一个作用域,父类的作用域包括子类的作用域。因此,子类的同名函数、变量将会覆盖父类的函数、变量,不管是否virtual,是否重载了,也是一样。这是C++想减少我们犯错误的机会。
但是我们要是我们非得去使用怎么办?using。
这样子让父类名为mf1和mf3的所有东西在子类的作用域可见了。当然子类的覆盖效果还是存在。
如果不想将父类的所有同名函数都暴露给子类,可以在子类中声明函数调用的方法来获取。
class Base{ private: int x; 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(); ... };
然后执行如下调用:
Derived d; int x; ... d.mf1();//Derived::mf1() d.mf1(x);//wrong d.mf2();//Base::mf2 d.mf3();//Derived::mf3 d.mf3(x);//wrong
为什么会出错呢?子类不是可以访问父类的成员吗?看看下面这个也许就明白了。
int x; void f() { double x; std::cin >> x; }
虽然类型不一样,但在f函数内部使用的是函数内部作用域的变量x。类也是一个作用域,父类的作用域包括子类的作用域。因此,子类的同名函数、变量将会覆盖父类的函数、变量,不管是否virtual,是否重载了,也是一样。这是C++想减少我们犯错误的机会。
但是我们要是我们非得去使用怎么办?using。
class Base{ private: int x; public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); ... }; class Derived: public Base{ public: using Base::mf1; using Base::mf3; virtual void mf1(); void mf3(); void mf4(); ... };
这样子让父类名为mf1和mf3的所有东西在子类的作用域可见了。当然子类的覆盖效果还是存在。
Derived d; int x; ... d.mf1();//Derived::mf1() d.mf1(x);//Base::mf1 d.mf2();//Base::mf2 d.mf3();//Derived::mf3 d.mf3(x);//Base::mf3
如果不想将父类的所有同名函数都暴露给子类,可以在子类中声明函数调用的方法来获取。
class Derived:private Base{ ... virtual void mf1(){ Base::mf1(); } ... }
相关文章推荐
- C++箴言:避免覆盖通过继承得到的名字
- C++_继承名字覆盖
- 谈谈C++继承中的重载,覆盖和隐藏
- 谈C++继承中的重载、覆盖和隐藏
- c++基础之名字覆盖问题和命名规范
- 谈谈C++继承中的重载,覆盖和隐藏
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
- C++继承详解之二——派生类成员函数详解(函数隐藏、构造函数与兼容覆盖规则)
- C++ 重载,重定义(覆盖),重写名字隐藏
- C++继承体系中名字遮挡问题
- c++ 类继承中的隐藏、覆盖、重载与using使用
- 谈谈C++继承中的重载,覆盖和隐藏
- C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- 从虚函数的内存构造谈C++继承中函数的覆盖与隐藏
- C++继承中的重载,覆盖和隐藏
- 谈谈C++继承中的重载,覆盖和隐藏2
- cocos2dx lua中继承与覆盖C++方法
- 谈谈C++继承中的重载,覆盖和隐藏
- C++ 继承中的覆盖,隐藏,虚拟继承