【发布时间】:2010-07-05 07:53:47
【问题描述】:
请看下面的代码:
#include <iostream>
using namespace std;
class A {
public:
A() {};
virtual void foo(double d) { cout << d << endl; }
virtual void foo(double d, int a) = 0;
};
class B : public A {
public:
B() {};
virtual void foo(double d, int a) { cout << d << endl << a << endl; }
};
int main()
{
B b;
b.foo(3.14);
return 0;
}
编译器(尝试过 g++ 和 visual c++ 2008)说没有像 B:foo(double) 这样的函数。 g++ 的确切信息是:
main.cpp:21: 错误:没有匹配函数调用‘B::foo(double)’
它看起来像hiding rule 的效果,但我认为这里不应该使用该规则,因为我没有覆盖 foo(double) 并且两个 foo 方法都定义在基类中。
我知道我可以用
解决问题using A::foo;
派生类B中的声明。
你能解释一下为什么代码不能编译,C++ 的哪些规则在这里适用吗?
【问题讨论】:
-
这只是“名称隐藏”问题。为什么不能只使用
using A::foo子句? -
不是完全重复,但这里讨论的问题相同:stackoverflow.com/questions/72010/c-overload-resolution
-
在这种情况下,如果您想实现纯虚拟 foo 方法,您必须重新定义名称为
foo的所有方法,或者为纯虚拟方法和实现的方法选择不同的名称。 -
嘿嘿,B中的foo(double, int)不用指定是虚的。
标签: c++