Я бы запретил дочерним классам переопределять базовый метод, и чтобы дочерние классы переопределяли новый метод в родительском классе. Другими словами, дочерний класс базового класса блокирует методы базового класса и делегирует новый метод, который должны переопределять другие дочерние классы. Я все еще хочу, чтобы метод базового класса был доступен.
Вот пример:
#include <iostream>
#include <string>
struct Base
{
virtual const std::string& class_name(void) = 0;
};
struct Level1
: public Base
{
private: // Prevent child classes from overriding
// the Base::class_name method
const std::string& class_name(void)
{
static std::string name;
name = "class" + class_name_from_level_1();
return name;
}
protected:
// This is the "new" or redirected class that child classes
// must override.
virtual const std::string& class_name_from_level_1(void) = 0;
};
struct Level2
: public Level1
{
static std::string name;
const std::string& class_name_from_level_1(void)
{
if (name.length() == 0)
{
name = "Level2";
}
return name;
}
};
int main(void)
{
Level2 lev2;
std::cout << lev2.class_name() << "\n";
return 0;
}
Я получаю следующие ошибки от g++
:
$ g++ hiding_virt_methods.cpp -o hiding_virt_methods.exe
hiding_virt_methods.cpp: In function `int main()':
hiding_virt_methods.cpp:15: error: `virtual const std::string& Level1::class_name()' is private
hiding_virt_methods.cpp:43: error: within this context
В приведенном выше примере я хочу следующую цепочку выполнения для Level2:
Base :: class_name () -> Level1 :: class_name_from_level_1 () -> Level2 :: class_name_from_level_1 ()
Кроме того, я хочу заблокировать только наследование определенных методов в базовом классе. Защищенное и частное наследование влияет на все общедоступные методы.
Итак, как мне остановить цепочку наследования определенных базовых методов на разных уровнях в дереве наследования?
Редактировать: Пример из реального мира.
У меня есть интерфейс класса Record. Класс Record_With_Id наследуется от класса Record и добавляет поле идентификатора. Класс Record содержит метод accept_visitor
. Класс Record_With_Id переопределяет accept_visitor
для применения к полю идентификатора, затем вызывает виртуальный метод record_with_id_accept_visitor
, который должны реализовать потомки.