2017-03-14 67 views
3

我新的C++和試圖寫一個界面,如下方法調用(左值)結合功能(右值):C++中派生類代替基類功能(左值)

template <class T> 
class Comparable 
{ 
    protected: 
     Comparable(){}; 
    public: 
     virtual int compare(const T&&)=0; 
     int compare(const T& o) 
     { 
     return this->compare(std::move(o)); 
     } 
}; 

我確實這試圖讓比較方法與兩個l/r值一起工作。 我得出可比以下類:

class Monkey : Comparable<Monkey> 
{ 
    private: 
     char name[512]; 
    public: 
     Monkey(const char*&& name) 
     { 
     strcpy(this->name, name); 
     } 
     const char *getName() { return name; } 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 

與main()方法如下:

Monkey m1(argv[1]), m2(argv[2]); 
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1)); 

但我得到一個編譯錯誤:

不能結合「試驗::猴'lvalue to'const Tests :: Monkey & &' 初始化參數1'虛擬int測試::猴::比較(const Tests :: Monkey & &)' 構建失敗

爲什麼該方法調用不綁定到基類中的比較方法?

當我在基類中將它們都創建爲虛擬類型並將它們都寫入派生類時,綁定工作正常,但它不起作用,並且如果我嘗試編譯它時會發生編譯錯誤這裏。

+0

我真的不明白爲什麼你用右值引用到處。 「比較」函數的正常const引用可以很好地工作。並將右值引用傳遞給'const char *'?這確實沒有多大意義。最後,不變的右值引用通常也沒有意義。 –

+0

我是新來的C++。我認爲引用可以防止複製,這是函數調用的默認行爲,所以我認爲,習慣使用它們並習慣它們可能是一種好習慣。我以前見過const引用。儘管它的性能影響可能可以忽略不計。 –

+0

@JoePaul引用也引入了[overhead](http://stackoverflow.com/questions/8250932/what-is-the-overhead-of-passing-a-reference)。在你的情況下,const的左值引用會做perferect。右值引用主要用於完美轉發和移動語義。 – felix

回答

3

這是名稱隱藏;派生類中的名稱隱藏了基類中的名稱。總之,你不能通過不同的範圍來重載函數。

unqualified name lookup規則,爲m2.compare(m1)m2Monkey類型的,名稱compare將在派生Monkey類首先的範圍中找到,則名稱查找停止。基類中的compare將不會被考慮用於以下重載解析。

(重點煤礦)

For an unqualified name, that is a name that does not appear to the right of a scope resolution operator ::, name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

您可以通過using引入基類的名稱爲派生類的範圍:

class Monkey : Comparable<Monkey> 
{ 
     ... 

     using Comparable<Monkey>::compare; 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 
+0

謝謝。那回答了我的問題。 –