继承和方法重载

Posted

技术标签:

【中文标题】继承和方法重载【英文标题】:Inheritance and method overloading 【发布时间】:2011-02-27 18:34:45 【问题描述】:

为什么 C++ 编译器会出现这个错误?为什么我可以从 B 访问 lol(),但无法访问 rofl() [无参数]。问题在哪里?

class A

public:
   void lol(void) 
   void rofl(void)  return rofl(0);
   virtual void rofl(int x) 
;

class B : public A

public:
   virtual void rofl(int x) 
;

int _tmain(int argc, _TCHAR* argv[])

    A a;
   a.lol();
   a.rofl(1);
   a.rofl();

   B  b;
   b.lol();
   b.rofl(1);    
   b.rofl(); //ERROR -> B::rofl function does not take 0 arguments


   return 0;

【问题讨论】:

【参考方案1】:

B::rofl(int)“隐藏”A::rofl()。为了让Arofl 重载,您应该将B 声明为using A::rofl;

class B : public A 
public: 
    using A::rofl;
    ...
;

这是 C++ 的一个明智之举:它警告您可能还需要覆盖 B 中的 A::rofl() 方法。要么这样做,要么明确声明使用A 的其他重载。

【讨论】:

是的,但是 A::rofl() 不是虚拟的。这就是想法 - rofl() 总是调用虚拟 rofl(0)。 @0xDEAD BEEF:在这种情况下,您打算使用它,因此请告诉编译器 using A::rofl; @0xDEAD BEEF:顺便说一句,您正在以这种方式创建“非虚拟界面”;您可能希望您的 A::rofl(int) 是纯虚拟的,并且受到保护。 没有。我想创建纯虚拟 Read(buffer, size, timeout) 和 wrapper (override) Read(buffer, size) Read(buffer, size, 0); BTW - 使用关键字效果很好! @xtofl 有这样的方法名称,问题已经为你解决了:p

以上是关于继承和方法重载的主要内容,如果未能解决你的问题,请参考以下文章

方法重载和继承

java中重载,继承,重写和多态的区别

方法重载和继承——如何找到正确的方法?

.Net 继承和方法重载

继承和方法重载

重载与重写区别?