在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定义的类有更大的区别。实际上它们唯一的不同只是默认的成员保护级别和默认的派生保护级别,除此之外,再也没有其他的区别。 |