2017-01-23 131 views
1

我有一個結構,我使用一個純粹的抽象接口(只有公共方法,它們都是=0),一個抽象類隱藏實現細節和兩個繼承它的子類。接口和公共方法

我想在這些子類中公開一些公共方法,因爲它們只在該上下文中有意義,但將它們標記爲公共不起作用,因爲編譯器似乎只能在界面中看到公共方法。我怎樣才能讓兒童課程中的公共方法可用?

更新

接口:

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