可能重复:
C++ method only visible when object cast to base class?!
我有以下代码:
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)
,对吗?
答案 0 :(得分:2)
派生类hide中的Add
方法基类中定义的方法。
如果您希望不隐藏基类的Add
,可以向派生类添加using
指令:
class StrVector : public Vector<String> {
public:
using Vector<String>::Add;
...
}
答案 1 :(得分:1)
不。您通过在类Add
中声明Vector
函数隐藏了所有Add
函数ov StrVector
。编译器发出错误,它是正确的:int Add(String&)
无法访问。
答案 2 :(得分:1)
我猜你的意思是“不工作”是对Add
的调用无法编译(没有合适的候选人,或类似的东西)。
StrVector中声明的Add
方法隐藏了基类中的{{1}}方法。有关完整说明,请参阅Namespaces and the Interface Principle。
答案 3 :(得分:0)
你从来没有给Vector一个实际的模板参数,只是说它是一个模板。您需要template<typename T>
。接下来,StrVector
需要继承Vector<char*>
,但为什么你继承它,我实际上并不知道。
在cousre中,在实际代码中,您使用的是std::vector<std:string>
。