У этого есть ощущение полного вопроса новичков, но почему следующий код не компилируется, когда спецификатор final
используется для B::operator()
?C++ одно и то же имя для не виртуальной функции в конфликтах с производным классом с опцией `final`
struct A
{
virtual void operator()() const = 0;
};
// the CRTP-component is not really necessary here
// but it possibly makes more sense in that it could be applied like this in reality
//
template<typename Derived>
struct B : A
{
virtual void operator()() const override final
{
static_cast<Derived const&>(*this).operator()();
}
};
struct C : B<C>
{
void operator()() const
{
//do something
}
};
int main()
{
C()();
}
G ++ печатает следующее error message:
main.cpp:17:14: error: virtual function 'virtual void C::operator()() const'
void operator()() const
^
main.cpp:9:22: error: overriding final function 'void B<Derived>::operator()() const [with Derived = C]'
virtual void operator()() const override final
^
я бы подумал, что это работает как невиртуальном C::operator()
не отменяет виртуальные функции в своих базовых классов? Как я могу заставить это работать (- без изменения имени C::operator()
)?
EDIT: Как было отмечено несколькими пользователями, то ответ просто, что virtual
-ключевое слово в производном классе является излишним (в то время как я думал, оставляя это предотвратит наследование). Тем не менее, цель, которую я должен был спрашивать это - именно последовательный интерфейс по всей динамической и статической иерархии наследования - может быть решена с помощью невиртуальный operator[]
повсюду и пару классов A
и B
виртуальной функции apply
:
struct A
{
void operator()() const
{
this->apply();
}
protected:
virtual void apply() const = 0;
};
template<typename Derived>
struct B : A
{
void operator()() const
{
static_cast<Derived const&>(*this).operator()();
}
protected:
virtual void apply() const override final
{
this->operator()();
}
};
struct C : B<C>
{
void operator()() const
{
//do something
}
};
int main()
{
C()();
}
@ Cheersandhth.-Alf: Я думал, что 'C :: operator()' только переопределяет, когда используется 'virtual'-ключевое слово ... что неправильно, как я узнал сегодня. – davidhigh
О, ладно. Я изменил свой ответ, убрав вопрос об этом. Думаю, теперь вопрос заключается в том, как кто-то мог узнать о ссылках и 'final' и' override', 'virtual' и' template', а не о переопределениях. –