2017-01-09 68 views
4
class Base { 
    public: 
    virtual void f(); 
    void f(int); 
    virtual ~Base(); 
}; 

class Derived : public Base { 
public: 
    void f(); 
}; 

int main() 
{ 
    Derived *ptr = new Derived; 
    ptr->f(1); 
    delete ptr; 
    return 0; 
} 

ptr-> f(1);顯示以下錯誤:「函數調用中的參數太多」。C++中的多態現象爲什麼這不起作用?

爲什麼這是不可能的?是不是繼承了所有基函數的形式,並且可以自由使用它們中的任何一個? 我可以明確地調用它,它會工作,但爲什麼不允許這樣做?

+5

'f(int)'在'derived'中沒有被重載,你期望什麼? – SingerOfTheFall

+5

對於多態性,'ptr'應該是一個指向* base *類的指針。 –

+0

但不應該派生繼承基函數?或者它不適用於指針? – Dannz

回答

11

你所看到的叫做隱藏

當你重寫功能void f()Derived類,你隱藏Basef函數的所有其他變體。

您可以用using關鍵字解決這個問題:

class Derived : public Base { 
public: 
    using Base::f; // Pull all `f` symbols from the base class into the scope of this class 

    void f() override; // Override the non-argument version 
}; 
1

正如@Some編程多德提到:那是因爲隱藏的。

要了解躲在相對簡單的語言

Inheritance是爲了帶來Base類變量/函數Derived類。

但是,1個條件:「如果它不是在派生類已經可用」

由於f()Derived已經上市,它沒有任何意義看,從編譯器的角度Base類。

這就是爲什麼你需要澄清的範圍,同時調用這個函數

void main() 
    { 
     Derived *ptr = new Derived; 
     ptr->Base::f(1); 
     delete ptr; 
    } 
0

假設爲暫且認爲Derived確有訪問功能void Base::f(int);的確切原因。那麼這將是一個function overloading的情況。但是,這是function overloading的無效情況,因爲一個函數f(int);在Base中,而其他函數f();在Derived中。 Function Overloading發生在一個類中。 Function Overriding跨班發生。您發佈的示例爲Name Hiding in Inheritance

-1

「Derived * ptr」這種定義將只允許「ptr」訪問所有通過派生類或其子類定義的成員函數。但是,它不允許你訪問繼承的Derived類中的成員函數。

如果妳想要訪問的函數「f」基類版本,然後使用「基地* PTR」,它會自動選擇功能的正確版本如圖所示:)

class Base { 
    public: 
     virtual void f() 
     { 
      cout<<"Here 2"<<endl; 
     } 
     void f(int x) 
     { 
      cout<<"Here 1"<<endl; 
     } 
     virtual ~Base() {} 
}; 

class Derived : public Base { 
    public: 
     void f() 
     { 
      cout<<"Here 3"<<endl; 
     } 
     virtual ~Derived() {} 
}; 

int main() 
{ 
    Base *ptr = new Derived; 
    ptr->f(1); 
    delete ptr; 
    return 0; 
} 

輸出 這裏1