C ++模板:为什么这不起作用?

时间:2010-11-09 19:56:12

标签: c++ templates inheritance overloading

  

可能重复:
  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),对吗?

4 个答案:

答案 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>