2017-01-23 6 views
1

私は、実装の詳細とそれを継承する2つの子クラスを非表示にする抽象クラスである純粋な抽象的なインターフェイス(パブリックメソッドのみ、すべて=0)を使用する構造体を持っています。インタフェースとパブリックメソッド

彼らは唯一のそのコンテキストで意味をなすが、コンパイラは、唯一のインタフェースでのパブリックメソッドを見ることができるように思われるよう国民が動作しないようにそれらをマークするように私は、これらの子クラスでは、いくつかのパブリックメソッドを公開したいと思います。どのようにして、子クラスのpublicメソッドにアクセス可能にすることができますか?

更新

インタフェース:

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タイプが 'であることが望ましいと思います。それをresultに移動してください。 –

+0

良い点、例外の安全性を忘れました。 –

+0

@ChrisDrew add_columnsはnoexceptで、コードは単にベクトルに列を追加します。あなたは、この場合、組成がより良い解決策になると言っていますか? – ruipacheco

関連する問題