继承自模板类的实例

时间:2011-09-26 06:10:31

标签: c++ templates inheritance

我在头文件

中有两个类如下
template<size_t N>
class Parent{
    protected:
    char array[N];
    size_t i;
    public:
    virtual void operator()(int i);
};

template<size_t N>
void Parent<N>::operator()(int i){
    this->i = i;
}

class Child: public Parent<16>{
    public:
    virtual void operator()();
};

Child在cpp文件的其他地方定义了operator()()。每当我从另一个cpp文件中包含这个头文件时,我都可以访问operator()(),但是甚至没有定义operator()(int)。为什么是这样?我想,因为我从Parent的特定实例继承,所以它的所有方法都应该实例化并可用。

2 个答案:

答案 0 :(得分:2)

除了代码中的错误之外,这是隐藏的示例:您的派生类声明了一个同名但具有不同签名的函数作为基类。因此基本函数是隐藏

class A { virtual void foo(); };

class B : public A { virtual void foo(int); /* hides A::foo() ! */ };

继承只影响具有相同签名的函数(有一些温和的例外)。

您的基类函数声明为void Parent<N>::operator()(int),而在派生类中,您声明void Child::operator()()

在C ++ 11中,如果函数没有覆盖任何内容,你可以明确地说virtual void foo(int) override来触发编译器错误。

如果您有意想要定义一个与现有函数同名但具有不同签名的新函数,而不是覆盖基函数,那么您可以使用using指令使基函数可见:< / p>

class C : public A
{
  using A::foo();
  void foo(int);
};  // now have both C::foo(int) and C::foo()

答案 1 :(得分:0)

因为Parent的运算符()隐藏了Child的运算符()(它们具有不同的签名)。为什么编译代码时没有收到警告?

应该是这样的:

class Child: public Parent<16>{
  public:
    using Parent<16>::operator();
    virtual void operator()();
};