Я пытаюсь переопределить виртуальную функцию на С++. После того, как я переопределяю функцию, она на самом деле не переопределяет ее и, таким образом, делает класс абстрактным. Приведенный ниже код даст вам хорошее представление о проблеме.
Как вы можете видеть ниже, код отлично работает для шаблонов без указателей, таких как 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"
}
Обратите внимание, что для типа параметра const T&
, const
квалифицируется на самом T
, тогда, когда T
является указателем, подобным int *
, const
должен быть квалифицирован на самом указателе (т.е. int* const
), а не на указателе (т.е. const int*
).
Правильный тип должен быть
void doSomething(int* const & t)
Кстати: вы можете использовать ключевое слово override
, чтобы убедиться, что функция virtual
переопределена правильно.
BTW2: измените стиль для const T&
на T const&
, чтобы сделать его более понятным.
@ akarshkumar0101 Да, это правильно. Другими словами, вы не можете делать *p = 42;
и p2 = nullptr
, но можете p = nullptr;
и *p2 = 42;
.
О, хорошо, это имеет большой смысл. Спасибо! Просто для уточнения: int a = 3; константа int* p1 = &b; int* const p2= &b. В этом случае тип p1 подразумевает, что значение данных a будет постоянным, тогда как p2 подразумевает, что указатель p2 будет постоянным. Это правильно?