C ++中的public , private继承和protected继承有什么区别? 我在SO上发现的所有问题都与特定情况有关。
#1楼
如果您从另一个类公开继承,那么每个人都知道您正在继承,并且任何人都可以通过基类指针来使用您。
如果您保护性地继承您的子类,则可以多态使用您。
如果您私下继承,则只有您自己才能执行父类方法。
这基本上象征着其余班级对您与父母班级关系的了解
#2楼
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x is public
// y is protected
// z is not accessible from B
};
class C : protected A
{
// x is protected
// y is protected
// z is not accessible from C
};
class D : private A // 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};
重要说明:类B,C和D都包含变量x,y和z。 这只是访问的问题。
关于受保护和私有继承的用法,您可以在这里阅读。
#3楼
公共继承为IS-A关系建模。 用
class B {};
class D : public B {};
每个D 是一个 B
私有继承为IS-IMPLEMENTED-USING关系(或任何所谓的关系)建模。 用
class B {};
class D : private B {};
D 不是 B ,但是每个D在实现中都使用B 始终可以通过使用遏制来消除私有继承:
class B {};
class D {
private:
B b_;
};
该D也可以使用B来实现,在这种情况下,可以使用其b_ 。 与继承相比,包含是类型之间的紧密耦合,因此通常应首选。 有时使用包容代替私有继承不如私有继承方便。 通常这是懒惰的la脚借口。
我认为没有人知道什么protected继承模型。 至少我还没有看到任何令人信服的解释。
#4楼
限制继承的可见性将使代码无法看到某个类继承了另一个类:从派生到基础的隐式转换将不起作用,从基类到派生的static_cast也将不起作用。
只有类的成员/朋友可以看到私有继承,只有成员/朋友和派生类可以看到受保护的继承。
公共继承
IS-A继承。 按钮是一个窗口,在需要窗口的任何地方,也可以传递按钮。class button : public window { };
受保护的继承
受保护的术语实施。 很少有用。 在boost::compressed_pair使用,以从空类派生并使用空基类优化节省内存(下面的示例不使用模板保持原状):struct empty_pair_impl : protected empty_class_1 { non_empty_class_2 second; }; struct pair : private empty_pair_impl { non_empty_class_2 &second() { return this->second; } empty_class_1 &first() { return *this; // notice we return *this! } };
私人继承
以术语实施。 基类的用法仅用于实现派生类。 对于特征和大小重要的情况很有用(仅包含函数的空特征将利用空的基类优化)。 不过,通常围堵是更好的解决方案。 字符串的大小很关键,因此在这里很常见template struct string : private StorageModel { public: void realloc() { // uses inherited function StorageModel::realloc(); } };
公众成员
骨料class pair { public: First first; Second second; };
存取器class window { public: int getWidth() const; };
受保护的成员
为派生类提供增强的访问权限class stack { protected: vector c; }; class window { protected: void registerClass(window_descriptor w); };
私人会员
保留实施细节class window { private: int width; };
请注意,C样式强制转换允许以定义的安全方式将派生类强制转换为受保护的基类或私有基类,并且也可以强制转换为另一个方向。 应不惜一切代价避免这种情况,因为它可以使代码依赖于实现细节-但是,如有必要,您可以使用此技术。
#5楼
私人的:
基类的私有成员只能由该基类的成员访问。
上市:
该基类的成员,其派生类的成员以及在该基类和派生类之外的成员都可以访问该基类的公共成员。
受保护的:
基类的成员及其派生类的成员都可以访问基类的受保护成员。
简而言之:
私人的 :基地
保护 :基本+派生
公开 :基础+派生+任何其他成员