在问我的问题之前,我尝试在网上搜索,但我不确定我需要使用哪些术语,也没有找到对我的问题的解释。如果已经存在这样的答案,请随时指出我:)
这是一个小样本:
class IObject;
class ClassA;
class Base {
public: void Method(IObject * object) {}
};
class Derived : public Base {
public: void Method(ClassA * objet) {}
};
class IObject {};
class ClassA : public IObject {};
int main(int argc, char ** argv) {
IObject * object = new ClassA();
Derived derived;
derived.Method(object);
delete object;
return 0;
}
这不会编译,因为编译器尝试使用该方法的 Derived::Method 版本,即使给定对象存在完全有效的 Base::Method 也是如此。
为了使这个编译(和工作),我需要在 Derived 中添加以下内容:
class Derived : public Base {
public:
// adding this line make the Base::Method visible to the compiler ??
using Base::Method;
void Method(ClassA * object) {}
};
添加此行后,一切都按预期工作。我不明白的是:为什么?如果我将 Base::Method 重命名为 Base::BaseMethod,我可以毫无问题地从 Derived 实例调用它。为什么编译器无法根据参数的类型找到正确的方法??