2008年(909)
分类:
2008-05-06 21:26:23
我创建了一个类,基类中有虚拟重载函数。我想在派生类中改写基类中的虚拟重载函数。代码如下:
#include基类中有两个重载的test函数。当我在派生类中改写其中的一个函数时,我觉得另外一个应该在派生类中继承,但编译时出现一下错误信息:class 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); // 产生编译错误的代码行 }
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中的个别函数,则这个方法就不是那么好了。 下载本文示例代码