У меня есть структура, в которой я использую чистый абстрактный интерфейс (только общедоступные методы, и все они - =0
), абстрактный класс, чтобы скрыть детали реализации и два дочерних класса, которые наследуют его.Интерфейсы и общедоступные методы
Я бы хотел разоблачить некоторые общедоступные методы в этих дочерних классах, поскольку они имеют смысл только в этом контексте, но их обозначение как общедоступное не работает, поскольку только компилятор может видеть общедоступные методы в интерфейсе. Как я могу сделать общедоступные методы доступными дочерними классами?
Update
Интерфейс:
class Result {
public:
virtual ~Result() noexcept = default;
protected:
Result() = default;
};
Абстрактный класс:
template <typename T>
class AbstractResult : public Result {
public:
AbstractResult();
virtual ~AbstractResult() noexcept = default;
};
Первый ребенок:
class AResult : public AbstractResult<PGResult> {
public:
PGResult() = default;
virtual ~PGResult() noexcept = default;
void add_server_status(const char status) noexcept;
void add_command_complete(const CommandComplete command_complete) noexcept;
void add_columns(const vector<Column> columns) noexcept;
void add_error(const Error error) noexcept;
void add_notification(const Notification notification) noexcept;
};
Я бы хотел бы создать экземпляр Result
и вызвать add_columns(...)
на нем, который запрещен компилятором:
unique_ptr<Result> result.reset(new AResult);
result->add_columns(...)
Вы можете показать некоторые из своих кодов, чтобы посмотреть как ссылку? –
Вызывающий код должен будет использовать 'dynamic_cast' для преобразования из ссылки на интерфейс в ссылку на производный класс (и допускать исключение), а затем вызывать метод в производном классе. (Вы также можете использовать динамические указатели для броска - вы должны проверить результат для 'nullptr') –
Можете ли вы рассказать о том, почему у вас есть абстрактный класс, наследуемый от конкретного класса? Это не типичный шаблон на C++. Обычно ваш абстрактный интерфейс будет определять минимальный, но полный интерфейс ко всем реализациям, устраняя необходимость знать, какая реализация была создана. –