是否可以在 C++ 继承中“取消私有”元素?如果没有怎么办?
Posted
技术标签:
【中文标题】是否可以在 C++ 继承中“取消私有”元素?如果没有怎么办?【英文标题】:Is possible to "unprivate" an element in C++ inheritance? What to do if not? 【发布时间】:2019-10-19 06:44:18 【问题描述】:如果我想从“BaseClass”继承,但我必须管理其中一个私有成员,我可以用这样的东西“取消私有”它吗?:
using BaseClass::private_member;
如果没有,当一些成员没有被标记为protected
时该怎么办?如果不可能,那意味着我们不应该继承我们没有开发的类?
【问题讨论】:
不,private
说this is opaque internal implementation, you should not and cannot access it directly
。不,你仍然可以从你没有开发的类继承。
如果可以取消隐私,那么隐私的概念就消失了。
一切皆有可能。但是作为基类不变量的一部分,私有字段通常是有原因的。 99.99% 的正确做法是围绕它进行设计。
一个类控制其成员是否为private
。如果类之外的东西可以覆盖它,那么它就没有意义了。无论如何,如果不编辑该类的定义并重新编译使用该类的所有编译单元(又名源文件),就不可能“取消私有”类的private
成员。当然也可以从其他人开发的类继承——但这样做并不能访问该类的私有成员。
【参考方案1】:
如果我想从“BaseClass”继承,但我必须管理其中一个私有成员,我可以用这样的东西“取消私有”它吗?
没有。私有成员不能由派生类管理。如果你认为你必须管理基类的私有成员,那么某人的设计或实现是错误的。有缺陷的可能是基类,但请保持开放的心态——务必考虑缺陷存在于您的设计中的可能性。 (更好的是,假设缺陷可能存在于您的设计中,除非另有证明。)
如果没有,当一些成员没有被标记为应有的保护时该怎么办?
首先,验证这个假设。该成员应该被标记为受保护,还是您试图滥用基类? 如果该成员确实应该被标记为受保护,那么要做的就是修复基类。如果基类不在您的控制之下,请提交错误报告。
如果不可能,这意味着我们不应该从我们没有开发的类继承?
不,这意味着您不应该建立在有缺陷的基础上。 (或者可能这意味着您应该使用基类设计而不是反对它。)那里有很多实现良好的基类。为手头的工作使用正确的工具。
【讨论】:
以上是关于是否可以在 C++ 继承中“取消私有”元素?如果没有怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
C++父类中声明了一个虚函数以后 是否在子类 以及子类的子类中 都要声明并重写这个函数?