我有一个结构,我使用一个纯粹的抽象接口(只有公共方法,它们都是=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(...)
你可以显示一些你的代码作为参考吗? –
调用代码必须使用'dynamic_cast'将参考转换为对派生类的引用(并容忍异常),然后调用派生类的方法。 (你也可以动态投射指针 - 你必须检查'nullptr'的结果) –
你能详细说明为什么你有一个从具体类继承的抽象类吗?这不是C++中的典型模式。通常,您的抽象接口将为所有实现定义一个最小但完整的接口,而不需要知道创建了哪个实现。 –