2014-06-18 57 views
2

消失使用gcc版本4.8.2:const修飾的純虛函數

我運行到哪裏對我的參數const限定符當我編譯我的代碼正在消失的問題。下面是一個例子:

main.cc:

#include <iostream> 

class Base 
{ 
     public: 
     virtual int getSum(const int number) = 0; 
}; 

class Derived : public Base 
{ 
     public: 
     Derived(const int& num) 
     : _myNumber(num) 
     {} 

     virtual int getSum(const int number) 
     { 
       return _myNumber + number; 
     } 

     private: 
     int _myNumber; 
}; 

int main(int argc, const char* argv[]) 
{ 
     Base *b = new Derived(2); 

     std::cout << b->getSum(3) << "\n"; 

} 

編譯像這樣:

g++ main.cc -o const_test 

當我運行納米:

nm const_test | c++filt | grep getSum 

我得到以下輸出:

0000000000400b60 W Derived::getSum(int) 

爲什麼const在編譯時會從我的函數中消失?

+4

@πάνταῥεῖ更準確地說,它*有一個含義(在函數內),但它不是簽名的一部分。 –

+1

@Konrad Rudolph將其寫爲答案。 –

+0

這是一種語言規則,函數參數的cv-qualifiers在重載解析時被忽略。 C++語言規範的第13.1節。 –

回答

4

你的函數簽名

virtual int getSum(const int number) = 0; 

實際上是完全等同於

virtual int getSum(int number) = 0; 

const對函數簽名聲明按值傳遞的參數沒有影響。

唯一的影響是,您無法更改此方法潛在定義內的堆棧上的參數實例。事實上,僅僅將它放在那裏是足夠的,以防止更改函數體中的參數實例。

+0

值得一提的是,重要的是函數定義中的簽名。你提到這兩個簽名是相同的,但有時候人們不瞭解這一點的含義。 – juanchopanza

+0

@juanchopanza THX指出,我試圖澄清這一點。 –