私有继承、公共继承和保护继承之间的区别

私有继承、公共继承和保护继承之间的区别

.之间的区别是什么?publicprivate,和protectedC+中的继承?我发现的所有问题都是针对具体案件的。



手掌心
浏览 758回答 4
4回答

守着星空守着你

为了回答这个问题,我想先用我自己的话来描述成员的访问器。如果您已经知道这一点,请跳到标题“Next:”。我知道有三个访问器:public, protected和private.让:class Base {     public:         int publicMember;     protected:         int protectedMember;     private:         int privateMember;};所有意识到的Base也意识到Base含publicMember.只有孩子(和他们的孩子)知道Base含protectedMember.除了Base意识到privateMember.所谓“意识到”,我的意思是“承认存在,从而能够访问”。下一步:公共、私有和受保护的继承也是如此。让我们考虑一个类Base和一堂课Child继承自Base.如果继承是public,意识到的一切Base和Child也意识到Child继承自Base.如果继承是protected,只有Child,以及它的孩子们,都知道他们是从Base.如果继承是private,除了Child意识到了遗传。

牛魔王的故事

限制继承的可见性将使代码无法看到某些类继承了另一个类:从派生类到基类的隐式转换将无法工作,并且static_cast从基到派生也不起作用。只有类的成员/朋友才能看到私有继承,只有成员/朋友和派生类才能看到受保护的继承。公众继承是-遗产。按钮是一个窗口,在任何需要窗口的地方,也可以传递一个按钮。class&nbsp;button&nbsp;:&nbsp;public&nbsp;window&nbsp;{&nbsp;};受保护继承受保护-实施-条件。很少有用。用于boost::compressed_pair若要从空类派生并使用空基类优化来节省内存(例如,下面的示例不使用模板来保持当前状态):struct&nbsp;empty_pair_impl&nbsp;:&nbsp;protected&nbsp;empty_class_1&nbsp; {&nbsp;non_empty_class_2&nbsp;second;&nbsp;};struct&nbsp;pair&nbsp;:&nbsp;private&nbsp;empty_pair_impl&nbsp;{ &nbsp;&nbsp;non_empty_class_2&nbsp;&second()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this->second; &nbsp;&nbsp;} &nbsp;&nbsp;empty_class_1&nbsp;&first()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*this;&nbsp;//&nbsp;notice&nbsp;we&nbsp;return&nbsp;*this! &nbsp;&nbsp;}};私继承已实施-在-条件下。基类的使用仅用于实现派生类。对特征有用,如果大小重要(只包含函数的空特征将使用空基类优化)。经常安全壳不过,这是更好的解决办法。字符串的大小是非常重要的,所以这里经常使用它template<typename&nbsp;StorageModel>struct&nbsp;string&nbsp;:&nbsp;private&nbsp;StorageModel&nbsp;{public: &nbsp;&nbsp;void&nbsp;realloc()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;uses&nbsp;inherited&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;StorageModel::realloc(); &nbsp;&nbsp;}};公众成员骨料class&nbsp;pair&nbsp;{public: &nbsp;&nbsp;First&nbsp;first; &nbsp;&nbsp;Second&nbsp;second;};存取器class&nbsp;window&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;getWidth()&nbsp;const;};受保护成员为派生类提供更好的访问class&nbsp;stack&nbsp;{protected: &nbsp;&nbsp;vector<element>&nbsp;c;};class&nbsp;window&nbsp;{protected: &nbsp;&nbsp;void&nbsp;registerClass(window_descriptor&nbsp;w);};私成员保留实现细节class&nbsp;window&nbsp;{private: &nbsp;&nbsp;int&nbsp;width;};请注意,C风格的强制转换允许以一种定义和安全的方式将派生类强制转换到受保护的或私有的基类,并将其转换到另一个方向。应该不惜一切代价避免这种情况,因为它可以使代码依赖于实现细节-但如果有必要,您可以使用这种技术。

慕尼黑8549860

它与基类的公共成员如何从派生类中公开有关。>基类的公共成员将是公共的(通常是默认的)受保护的->基类的公共成员将受到保护>基类的公共成员将是私有的正如litb所指出的,公共继承是传统的继承,您将在大多数编程语言中看到这一点。那就是它塑造了一种“是-A”的关系。私有继承,是C+特有的AFAIK,是一种“在关系中实现的”关系。那就是你想使用派生类中的公共接口,但不希望派生类的用户访问该接口。许多人认为,在这种情况下,您应该聚合基类,而不是将基类作为私有基类,而是在派生的成员中进行聚合,以便重用基类的功能。
打开App,查看更多内容
随时随地看视频慕课网APP