【发布时间】:2018-12-27 10:14:54
【问题描述】:
我有大量的 protected 成员函数在 派生 类使用的`基类 hpp 文件中声明。我的想法是从头文件中删除它们以减少编译依赖。我也想过对受保护的成员使用 pimpl 方法。
我在 Base 类 cpp 文件中定义了一个 Impl 类,并将所有 protected 函数移到 Impl 中班级。此外,我在 Base 类头文件中将 Impl 类作为受保护成员进行了前向声明。
protected:
class Impl;
Impl* impl_;
但这样做时,当我使用 derived 类中的 impl_ 调用受保护函数时,派生类编译中出现以下错误::
error: invalid use of incomplete type ‘class Base::Impl’
if (false == impl_->EncodeMMMsgHeader(mm_msg_header_)) {
error: forward declaration of ‘class Base::Impl’
我认为错误的发生是因为在编译器需要关于类的上下文信息的任何情况下都不能使用前向声明,编译器也没有任何用处,只告诉它关于类的一点点。
有什么办法可以克服上述问题吗?如果没有,那么任何人都可以建议我一个更好的方法来实现我的目标。
【问题讨论】:
-
受保护和虚拟方法是接口的一部分,不应隐藏在 pimpl 中。
-
不确定@Jarod42,受保护的虚函数通常是实现的一部分,而几乎从不是接口的一部分。
-
@EduardRostomyan:派生类看到并可以使用
protected数据,并且可以覆盖每个virtual(非final)方法。 -
同意,但这并不使它成为类接口的一部分,恰恰相反,它使它们成为实现的一部分
标签: c++ oop inheritance protected pimpl-idiom