2010-11-09 47 views
1

可能重複:
C++ method only visible when object cast to base class?!C++模板:爲什麼不能正常工作?

我有後續代碼:

class String { 
    char* _Text; 
public: 
    String(const char* s) { 
     int iLen = strlen(s); 
     _Text = new char [iLen+1]; 
     strcpy(_Text, s); 
    } 
}; 

template<typename T> 
class Vector { 
public: 
    int Add(T* pItem) { return 0; } 
    int Add(const T* pItem) { return 0; } 
    int Add(T& pItem) { return 0; } 
}; 

class StrVector : public Vector<String> { 
public: 
    int Add(char* pItem) { return 0; } 
    int Add(const char* pItem) { return 0; } 
}; 

void main() 
{ 
    String s; 
    StrVector v; 
    v.Add(s); <------------- 
} 

v.Add(s);應該叫Vector::Add(T& pItem),對不對?

+2

重複:http://stackoverflow.com/questions/2068088/c-method -only-visible-when-object-cast-to-base-class – GManNickG 2010-11-09 19:59:23

+2

(1)'StrVector :: Add' * shadow *'Vector :: Add';查找「StrVector :: Add」不會在基類中查找,因爲它在派生類中找到了函數。你可以在定義中使用'使用Vector :: Add;'來找到它們。 (2)'String'需要實現一個析構函數,然後需要[The Big Three](http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29)。 (3)'Vector'需要一個虛擬析構函數或受保護的析構函數;當它沒有虛擬析構函數時,通過基類指針刪除會導致UB。 (4)'main'返回'int'! – GManNickG 2010-11-09 20:03:10

+2

(5)你應該只使用'std :: string'和'std :: vector'。 (6)當你提出問題時,你需要定義「不工作」:不編譯,不符合你期望的(以及你期望的)等等?或者我可以選擇我的任何一點作爲 「有什麼問題」的答案。 – GManNickG 2010-11-09 20:03:52

回答

0

你從未給過Vector一個實際的模板參數,只是說它是一個模板。你需要有template<typename T>。接下來,StrVector需要繼承Vector<char*>,雖然爲什麼你從它繼承我實際上不知道。

在實際的代碼中,你會使用std::vector<std:string>

+0

這是格式錯誤,我修正了它。 – GManNickG 2010-11-09 20:00:14

+0

我認爲這不是重點。 – 2010-11-09 20:01:41

+0

@Alexandre:在OP確定他的代碼之前。 – Puppy 2010-11-09 22:06:39

1

沒有。您隱藏所有Add函數ov Vector通過聲明Add函數StrVector。編譯器發出錯誤,它是正確的:int Add(String&)不可訪問。

1

我想你的意思是「不工作」是Add的調用不能編譯(沒有合適的候選人或類似的東西)。

在StrVector中聲明的Add方法隱藏了它的基類。有關完整說明,請參閱Namespaces and the Interface Principle

2

Add方法派生類hide在基類中定義的方法。

如果你想在基類的Add不被隱藏,你可以將using指令添加到派生類:

class StrVector : public Vector<String> { 
public: 
    using Vector<String>::Add; 
    ... 
}