2017-01-23 97 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