【问题标题】: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;
}

【问题讨论】:

    标签: c++ inheritance overloading overriding


    【解决方案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
    猜你喜欢
    • 2017-01-07
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多