[英]overloaded functions are hidden in derived class
在派生類中如果我從基類重新定義/重載函數名稱,
那么那些重載的函數對於派生類是不可訪問/可見的。
為什么是這樣??
如果我們不從派生類中的基類重載被重載的函數,那么該函數的所有重載版本都可用於派生類
對象,這是為什么?
這背后的原因是什么。 如果你在編譯器和鏈接器級別解釋這一點
這對我更有幫助。 是不是不能支持這種scinario??
Edited For examble: class B { public: int f() {} int f(string s) {} }; class D : public B { public: int f(int) {} }; int main() { D d; d.f(1); //d.f(string); //hidden for D } Now object 'd' can't access f() and f(string).
TTBOMK 這沒有真正的技術原因,只是 Stroustrup 在創建語言時認為這是更好的默認設置。 (這類似於右值不隱式綁定到非const
引用的規則。)
您可以輕松地解決它,將基類版本顯式引入派生類的范圍:
class base {
public:
void f(int);
void g(int);
};
class derived : public base {
public:
using base::f;
void f(float);
void g(float); // hides base::g
};
或通過顯式調用:
derived d;
d.base::g(42); // explicitly call base class version
這些函數可用,您只需要顯式調用它們:
struct A {
void f(){}
};
struct B : public A {
void f() {}
};
int main() {
B b;
b.f(); // call derived function
b.A::f(); // call base function
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.