2017-01-23 16 views
1

У меня есть структура, в которой я использую чистый абстрактный интерфейс (только общедоступные методы, и все они - =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(...) 
+4

Вы можете показать некоторые из своих кодов, чтобы посмотреть как ссылку? –

+0

Вызывающий код должен будет использовать 'dynamic_cast' для преобразования из ссылки на интерфейс в ссылку на производный класс (и допускать исключение), а затем вызывать метод в производном классе. (Вы также можете использовать динамические указатели для броска - вы должны проверить результат для 'nullptr') –

+0

Можете ли вы рассказать о том, почему у вас есть абстрактный класс, наследуемый от конкретного класса? Это не типичный шаблон на C++. Обычно ваш абстрактный интерфейс будет определять минимальный, но полный интерфейс ко всем реализациям, устраняя необходимость знать, какая реализация была создана. –

ответ

4

Он смотрит мне нравится, когда вы создаете его вы знаете тип, поэтому копить, что вне перед назначением его в unique_ptr :

std::unique_ptr<AResult> temp(new AResult); 
temp->add_columns(...); 
unique_ptr<Result> result(std::move(temp)); 
+2

Если 'add_columns' выдает исключение, у вас есть утечка памяти. Я думаю, что для 'temp' предпочтительно иметь тип' unique_ptr ', а затем переместить его в результат. –

+0

Хороший вопрос, забыли об исключении безопасности - предложение принято. –

+0

@ChrisDrew add_columns noexcept и код просто добавляет столбец в вектор.Вы считаете, что композиция будет лучшим решением в этом случае? – ruipacheco

 Смежные вопросы

  • Нет связанных вопросов^_^