在問我的問題之前,我嘗試搜索網絡,但我不確定我需要使用哪些術語,但沒有找到解釋我的問題的方法。如果這樣的回答媒體鏈接存在,隨意只是點我吧:)根據參數的類型決議繼承的成員函數
這裏是一個小例子:
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;
}
這不會編譯,因爲編譯器嘗試使用派生::方法該方法的版本,即使對於給定對象存在完全有效的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實例調用它,而不會有任何問題。爲什麼編譯器無法根據參數的類型找到正確的方法?
是的,現在我知道使用哪些術語(例如「函數隱藏」)我發現了很多答案和重複的問題:) – Citron