1> 普通变量的名字覆盖
int x; void someFunc() { double x; // 虽然是double,但对编译器而言,还是和 std::cin >> x; // 上面的int重名,此处只能访问double的 }
2> 派生时发生的名字覆盖
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); // 编译错!基类的mf1(int)因名字被覆盖,编译器找不到 d.mf2(); // 调用Base::mf2 d.mf3(); // 调用Derived::mf3 d.mf3(x); // 编译错!mf3也同样被覆盖了
只是因为名字被覆盖,就导致子类不能派生基类的一些函数。
编译器如此处理,是为了在你重定义“公有派生
”来的函数族时,不小心漏掉其中一两个。但我们在实践中,常常是并不想重定义所有的函数的。
解决的方法是使用using:
class Derived: public Base { public: using Base::mf1; // 让mf1和mf3在子类中可用 using Base::mf3; // 并且是public属性 ...
加上这两句,编译运行就没有问题了。
私有继承
的时候,情况是不同的:
class Base { public: virtual void mf1() = 0; virtual void mf1(int); ... }; class Derived: private Base { public: virtual void mf1() { Base::mf1(); } ... }; Derived d; int x; d.mf1(); d.mf1(x); // 私有继承,外部不能使用
本文探讨了C++中名字覆盖的问题,包括普通变量的名字覆盖和派生时发生的名字覆盖现象,并介绍了如何通过using声明来解决这些问题。
1674

被折叠的 条评论
为什么被折叠?



