C ++ переопределяющий виртуальный шаблонный метод - PullRequest
2 голосов
/ 27 мая 2019

Я пытаюсь переопределить виртуальную функцию в C ++.После того, как я переопределяю функцию, она фактически не переопределяет ее и, таким образом, делает класс абстрактным.Приведенный ниже код даст вам хорошее понимание проблемы.

Как вы можете видеть ниже, код отлично работает для шаблонов без указателей, таких как int, но не работает с указателем int.

Я подумал, что, возможно, поскольку это было проблемой со ссылками на указатели, я удалил & в реализации Derived2, но это не помогло.

template<class T>
class Base {
    virtual void doSomething(const T& t) = 0;
};
class Derived1: public Base<int>{
    void doSomething(const int& t) {
    } // works perfectly
};
class Derived2: public Base<int*>{ 
    void doSomething(const int*& t) { 
    }
// apparently parent class function doSomething is still unimplemented, making Derived2 abstract???
};

int main(){
    Derived1 d1;
    Derived2 d2; // does not compile, "variable type 'Derived2' is an abstract class"
}

1 Ответ

5 голосов
/ 27 мая 2019

Обратите внимание, что для типа параметра const T&, const квалифицируется на самом T, тогда, когда T является указателем, подобным int *, const должен быть квалифицирован на самом указателе (т.е.int* const), а не pointee (то есть const int*).

Правильный тип должен быть

void doSomething(int* const & t)

Кстати: вы можете использовать ключевое слово override для подтверждения правильности переопределения функции virtual.

BTW2: изменение стиля для const T& на T const& может сделать его более понятным.

LIVE

...