2012-03-25 49 views
0

重寫基類的常量方法從派生類

class Base{ 
//... 
    public: 
    int get()const{ // const 
    // Do something. 
    } 
    int get(int x){ 
    // Do Someting. 
    } 

    //... 

}; 
class Derived:public Base{ 
//.... 
    public: 
    int get(){ // not const (not the same signature as the one is the base class) 
    //Dosomething 
    } 
     //... 

}; 

我知道,獲得()的派生類將隱藏get()和獲取(INT X)的基類中的方法。所以我的問題是:
1)這是conconred重載或覆蓋?
2)在派生類中get()const會改變一些內容(隱藏或不隱藏基類方法)。

「這是一個常見的錯誤隱藏基類的方法,當你打算重寫它,通過 忘記包括關鍵字const常量是簽名的一部分,和:從C++的書

報價離開它關閉 改變了簽名,從而隱藏方法,而不是覆蓋它。「

+0

重載:http://en.wikipedia.org/wiki/Function_overloading,覆蓋:http://en.wikipedia.org/wiki/Method_overriding – alfa 2012-03-25 18:54:07

+0

第二個得到基地錯過了返回類型 – 2012-03-25 18:56:56

回答

6

它既不重載也不重寫。相反,它是隱藏

如果其他功能也是可見的,它被超載,您可以用using實現:

class Derived : public Base 
{ 
public: 
    using Base::get; 
    int get(); 
}; 

即使你宣佈在派生類中int get() const,它只會躲在基地功能,因爲基本功能不是virtual

+0

1)所以重寫的唯一情況是讓Derived類中的get函數可見?
2)不會給我一個錯誤,因爲它是多重定義? – AlexDan 2012-03-25 19:06:38

+0

@AlexDan:不,唯一的重寫方法是使'get' * virtual *,然後在'Derived'中用相同的簽名聲明另一個函數。 – 2012-03-25 19:08:11

+0

你用前面提到的方法怎麼樣,用'使用'關鍵字。這是否超越了壓倒一切?你可以向我解釋Derived類中關鍵字'using'的用法。並抱歉所有這個問題。 012 – AlexDan 2012-03-25 19:12:40

2
  1. 都不是,它只是‘隱藏’。

  2. 編號隱藏是根據函數名而不是函數簽名發生的。

只有聲明瞭基類功能virtual;你不能覆蓋一個非virtual函數。

+0

我讀了一本書:Quote「這是一個常見的錯誤,當你打算重寫它時隱藏一個基類方法, 忘記了包含關鍵字const。const是簽名的一部分,並且將它關閉 更改簽名,從而隱藏方法而不是重寫它。「你能解釋給我嗎?謝謝 – AlexDan 2012-03-25 18:55:26

+0

@AlexDan:看到我更新的答案。 – 2012-03-25 18:55:41

相關問題