如何在派生类中的隐藏基类的虚拟重载函数?,如何在派生类中的隐藏基类的虚拟重载函数?
【 tulaoshi.com - C语言心得技巧 】
如何在派生类中的隐藏基类的虚拟重载函数?
作者:northtibet
我创建了一个类,基类中有虚拟重载函数。我想在派生类中改写基类中的虚拟重载函数。代码如下:
#include <iostream.hclass B {private: int nNumber;public: virtual void test() { cout << "B::test()n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::test(int x)n"; }};class D : public B {public://test(void) 隐藏 B::test(int) virtual void test() { cout << "D::test()n"; }};void main(int argc, char* argv[]){ D d; // 派生类的实例 d.test(); // OK d.test(17); // 产生编译错误的代码行}基类中有两个重载的test函数。当我在派生类中改写其中的一个函数时,我觉得另外一个应该在派生类中继承,但编译时出现一下错误信息:
class D : public B {public: virtual void test(int x) { B::test(x); } ……};这样,D就有了两个test函数,问题也解决了。 其实这个问题还有另外一个解法:那就是在派生类中使用"using"关键字。如:
class D : public B {public:using B::test;// 改写test virtual void test() { cout << "D::test()n";}};这个关键字将B::test带入类D中。它的优点是当类B扩展更多的test重载函数时,你不用再去重写类D的代码。这样省了很多事。只要你使用using关键字,那么就意味着所有重载的B::test函数都进入类D并且得到继承。这种特性可能对于某些人来说是优点,而对于另外一些人来说是缺点,依赖于你要做什么事情。如果你想要向类D的用户隐藏某些test函数,则可以用第一种方法(显式调用基类),或者让你想要隐藏的函数成为private 或 protected类型。如果你读过Scott的书《Effective C++》,还可以用第二种方法利用using关键字巧妙地保证基类的私隐。
class B {public: func1(); func2(double d); virtual test(); virtual test(int x);};// D 从B中秘密派生class D : private B {public: // 让所有 B::test 函数为 public类型 using B::test;};显然,当希望完全隐藏类B时,这个方法很有用,但如果想要公开B中的个别函数,则这个方法就不是那么好了。
来源:http://www.tulaoshi.com/n/20160129/1485575.html
看过《如何在派生类中的隐藏基类的虚拟重载函数?》的人还看了以下文章 更多>>