У меня есть базовый класс, унаследованный многими подклассами. Мне нужно определить новую подпись для абстрактного метода, который в основном является оберткой. Я попробовал этотВнедрение обертки для абстрактного метода в базовом классе
class B {
public:
virtual void f() = 0;
void f(string msg) { /* print msg and call f() */ }
};
class D : public B {
public:
void f() override { /* implementatation */}
};
int main() {
D d;
d.f("msg");
}
Но он не компилируется и дать следующую ошибку
error: no matching function for call to 'D::f(string)
Мои вопросы:
- Почему не
D::f(string)
могут быть решены? - Почему любая из следующих проблем устраняет проблему?
- переименование
f(string)
кf2(string)
(некрасиво) - определение
D::f(string x) { B::f(x)}
(некрасиво, как это должно быть определено в каждом подклассов) - удаления абстрактный метод,
B::f()
(не приемлемо)
- переименование
Любое лучшее решение?
Выведенная 'ф 'override скрывает базу' f (std :: string) '. Попробуйте помещать 'using B :: f;' в ваш производный класс, чтобы привести их из 'B' – Alejandro
@ Ответы Alejandro принадлежат как ответы, а не как комментарии. – Barry
Учитывая, что один 'f' вызывает другой' f', у них есть несколько разные роли. Поэтому переименование их, чтобы отличать инициатора более высокого уровня от реализации, может быть полезно просто для ясности (в дополнение к решению проблемы). – TheUndeadFish