Наследование от экземпляра класса шаблона - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть два класса следующим образом в заголовочном файле

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()();
};

У дочернего элемента есть оператор () (), определенный в другом месте в файле cpp.Всякий раз, когда я включаю этот заголовочный файл из другого файла cpp, я могу получить доступ к operator () (), но operator () (int) даже не определен.Почему это?Я подумал, что поскольку я наследую от конкретного экземпляра Parent, все его методы также должны быть созданы и доступны.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Помимо ошибок в вашем коде, это пример сокрытия : ваш производный класс объявляет функцию с тем же именем , но с другой сигнатурой в качестве базового класса. Таким образом, базовая функция скрыта :

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:

class C : public A
{
  using A::foo();
  void foo(int);
};  // now have both C::foo(int) and C::foo()
0 голосов
/ 26 сентября 2011

Поскольку оператор Родителя () скрывает оператор Ребёнка () (у них разные подписи).Почему вы не получаете предупреждений при компиляции кода?

Вот как это должно быть:

class Child: public Parent<16>{
  public:
    using Parent<16>::operator();
    virtual void operator()();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...