继承和方法重载 为什么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++编译器会给出这个错误?为什么我可以从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,C++,Inheritance,Overloading,Overriding,B::rofl(int)“隐藏”A::rofl()。为了使A的rofl重载,您应该使用A::rofl将B声明为 class B : public A { public: using A::rofl; ... }; 这是C++的明智之举:它警告您可能还需要重写B中的a::rofl()方法。要么这样做,要么显式声明使用A的其他重载。是的,但A::rofl()不是虚拟的。这就是-rofl()始终调用virtual-rofl(0)的想法。@0xDEAD-BEEF:在这种情况下,您打算

B::rofl(int)
“隐藏”A::rofl()。为了使
A
rofl
重载,您应该使用A::rofl将
B
声明为

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

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

是的,但A::rofl()不是虚拟的。这就是-rofl()始终调用virtual-rofl(0)的想法。@0xDEAD-BEEF:在这种情况下,您打算使用它,所以通过使用A::rofl告诉编译器
@0xDEAD BEEF:顺便说一句,您正在以这种方式创建“非虚拟接口”;您可能希望您的
A::rofl(int)
是纯虚拟的,并且受保护。否。我想包装纯虚拟读取(缓冲区,大小,超时)和包装器(覆盖)读取(缓冲区,大小){Read(缓冲区,大小,0);}顺便说一句-使用关键字效果很好
@xtofl
有了这样的方法名称,这个问题就为您解决了:p