簡體   English   中英

重載函數隱藏在派生類中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM