继承和方法重载
问题描述:
为什么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;
}
答
B::rofl(int)
'隐藏'A::rofl()
。为了让A
的rofl
过载,您应该声明B
为using A::rofl;
。
class B : public A {
public:
using A::rofl;
...
};
这是C++明智之举:它警告你,你也可能需要重写A::rofl()
方法B
。要么你这样做,要么你明确声明你使用了A
的其他重载。
+1比我更快的队友:) – AraK 2010-06-04 12:24:11
是的,但A :: rofl()不是虚拟的。这就是想法 - rofl()总是调用虚拟rofl(0)。 – 2010-06-04 12:26:44
@ 0xDEAD BEEF:在这种情况下,你可以使用它,所以通过说'使用A :: rofl;'来清楚地告诉编译器。 – xtofl 2010-06-04 12:33:29