是否可以在 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时该怎么办?如果不可能,那意味着我们不应该继承我们没有开发的类?

【问题讨论】:

不,privatethis is opaque internal implementation, you should not and cannot access it directly。不,你仍然可以从你没有开发的类继承。 如果可以取消隐私,那么隐私的概念就消失了。 一切皆有可能。但是作为基类不变量的一部分,私有字段通常是有原因的。 99.99% 的正确做法是围绕它进行设计。 一个类控制其成员是否为private。如果类之外的东西可以覆盖它,那么它就没有意义了。无论如何,如果不编辑该类的定义并重新编译使用该类的所有编译单元(又名源文件),就不可能“取消私有”类的private 成员。当然也可以从其他人开发的类继承——但这样做并不能访问该类的私有成员。 【参考方案1】:

如果我想从“BaseClass”继承,但我必须管理其中一个私有成员,我可以用这样的东西“取消私有”它吗?

没有。私有成员不能由派生类管理。如果你认为你必须管理基类的私有成员,那么某人的设计或实现是错误的。有缺陷的可能是基类,但请保持开放的心态——务必考虑缺陷存在于您的设计中的可能性。 (更好的是,假设缺陷可能存在于您的设计中,除非另有证明。)

如果没有,当一些成员没有被标记为应有的保护时该怎么办?

首先,验证这个假设。该成员应该被标记为受保护,还是您试图滥用基类? 如果该成员确实应该被标记为受保护,那么要做的就是修复基类。如果基类不在您的控制之下,请提交错误报告。

如果不可能,这意味着我们不应该从我们没有开发的类继承?

不,这意味着您不应该建立在有缺陷的基础上。 (或者可能这意味着您应该使用基类设计而不是反对它。)那里有很多实现良好的基类。为手头的工作使用正确的工具。

【讨论】:

以上是关于是否可以在 C++ 继承中“取消私有”元素?如果没有怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

C++父类中声明了一个虚函数以后 是否在子类 以及子类的子类中 都要声明并重写这个函数?

C++ 容器与继承

是否可以在运行时从 c++ 类声明中知道继承的数量?

在 C++ 中检查向量的所有元素是不是相等

是否可以在 C++ 中更改向量的开始位置以清除其前 n 个元素?

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?