网上找了很多关于c++中这三者在继承方面的文章,貌似都不够全面。将几篇我觉得不错的文章整合了一下,方便大家查阅。
首先贴一个转载比较多的帖子: http://blog.youkuaiyun.com/wuliming_sc/archive/2009/01/18/3827743.aspx
在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,private继承是最少见的继承关系。
从语法角度上来说,public继承会保留基类中成员(包括函数和变量等)的可见性不变,也就是说,基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。 class CSample1 { protected: void printProtected() {} public: void printPublic() {} }; class CSample2 : protected CSample1 {}; class CSample3 : public CSample2 { void print3() { printProtected(); printPublic(); } };
3. private class CSample1 {
4. using声明 如果进行private或protected继承,则基类成员的访问级别在派生类中比在基类中更受限: class Base{ public: std::size_t size() const {return n;} protected: std::size_t n; }
class Derived : private Base{...}; 在这一继承层次中,size在Base中为public,但在Derived中为private。为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明。如下这样改变Derived的定义,可以使size成员能够被用户访问,并使n能够被从Derived派生的类访问: class Derived : private Base{ public: using Base::size; privated: using Base::n; //... }
用struct和class保留字定义的类具有不同的默认访问级别。同样,默认继承访问级别根据使用哪个保留字定义派生类也不相同。使用class保留字定义的派生类默认具有private继承,而用struct保留字定义的类默认具有public继承: class Base{/*...*/} struct D1 : Base{/*...*/}; //public inheritance by default class D2 : Base{/*...*/}; //private inheritance by default 有一种常见的误解认为用struct保留字定义的类与用class定义的类有更大的区别。实际上它们唯一的不同只是默认的成员保护级别和默认的派生保护级别,除此之外,再也没有其他的区别。
总的来说上面这个帖子写的挺不错的,可欠缺的是它隐藏了一些关系,如public的继承中,对父类各变量的访问权限及总的继承关系表。下面转载了一篇来自csdn上的帖子,对这方面加了一些说明:
class b:public a{} 继承的含义是b可以访问a中public, protected成员,但是不能访问a中private成员。 class b:protected a{} 继承的含义是b可以访问a中public, protected成员,并将a中public, protected成员转成protected成员,同时也不能访问a中private成员。 class b:private a{} 继承的含义是b可以访问a中public, protected成员,将a中public, protected成员转成private成员,不能访问a中private成员,同时如果b类再派生出子类的话(假设为c),那么c类将不可访问a类中的任何成员。 关系表如下:
继承方式 public private protected |