C++的疑似BUG?
#include <cstdlib>#include <iostream>using namespace std;class Base{public: virtual void func(){ cout << "Base::func()" << endl; } virtual int func( int num ){ cout << "Base::func( int " << num << " )" << endl; return 0; }};class Derived : public Base{public: virtual void func(){ cout << "Derived::func()" << endl; }};int main(){ Derived d; d.func(); d.func(1); system("PAUSE");}#include <cstdlib>#include <iostream>using namespace std;class Base{public: virtual void func(){ cout << "Base::func()" << endl; } virtual int func( int num ){ cout << "Base::func( int " << num << " )" << endl; return 0; }};class Derived : public Base{public: virtual void func1(){ cout << "Derived::func()" << endl; }};int main(){ Derived d; d.func(); d.func(1); system("PAUSE");}
[解决办法]
class Derived : public Base{public: using Base::func; virtual void func() { cout << "Derived::func()" << endl; }};
[解决办法]
回16 .
如果没有直接或间接用到的函数,在大多数编译器中会被优化掉.
如果是模板 ,那么没有用到的是肯定不会生成代码的.
[解决办法]
派生类中的同名函数“隐藏”了基类的同名函数(同名变量也会产生隐藏),这里的隐藏不管派生类中同名函数的访问控制如何?例如派生类中的私有fun仍然会隐藏基类中的公有fun(...)//参数任意,只要同名就会发生隐藏。
这其实不是什么重载(这与java中的重载是不一样的),c++中重载必须发生在同一作用域中,基类和派生类根本不在同一作用域,他们的作用域具有包含关系,相当于派生类嵌套在基类中,这与小作用域的同名变量会覆盖大作用域中的同名变量时一个道理(两作用域具有嵌套关系)。
//针对你这个问题,可有两种解决方案。
1.手动暴露基类中的同名变量,在派生类的public下引入 using Base::func; //如果引入到非public下,那么在外界,基类中的func仍然不可见
2.在外部调用基类中的同名函数时,手动指定作用域。 如:d.Base::func(1);
[解决办法]
看了你的帖子才知道有这个东西。
仔细想了想,似乎没有什么技术方面的理由来限制楼主想要的东西。但是在隐藏和不隐藏之间,我觉得隐藏更好。从下面三点看(我喜欢三点,呵呵)
1 重写和重载混合出现,本身就会带来代码维护性成本的提升。
2 不编译出错可能会增加你的开发成本,如果不隐藏的函数调用原本不是你的本意的话。
3 由于隐藏带来的编译出错,可以通过using或者再次重写来解决,问题可以得到及时发现。
过高的灵活性带来的不光是效益,还有风险。权衡两者的利弊,显然目前的方案似乎更好。