C++对父类(也称基类)的继承有三种方式,分别为:public继承、protected继承、private继承。三种继承方式的不同在于继承之后子类的成员函数的“可继承性质”。
在说三种继承方式导致的子类成员函数可继承性质改变之前,先说一下在定义类的成员(包括函数和属性)的时候,在其前面添加public 或 protected 或 private对成员的可继承性的影响。其中,public类型的成员,在被继承的时候,能直接被子类使用,注意,如果成员属性是public的话,子类则可直接调用该成员属性。例如:
class A // 父类
{
public:
A();
int size;
}
class B:public A // 子类
{
public:
change(const int x)
{
size = x;
}
}
我这里写了个很简单的例子,其中父类A具有一个public类型的成员函数A()和一个public类型的成员属性size(int)。因为size是public的,所以在A的子类B中,B的成员函数可以直接调用size进行修改。因为size也是B的属性并且是可见也是可修改的。
如果成员是protected的话,表明只有这个类的继承类(子女)或者友好的类(friend)能购使用(直接调用)这些成员,否则不能使用。然后private成员的话固然是只有自己本身这个类可用,对其他任何类都不可见,也不可用,引用百度百科上的一段话概括这三者就是:
“1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。”
好,下面进入正题,就是三种对父类的不同继承方式对子类可继承方式的影响:
(1)public继承:
不改变父类成员的继承性质(public、protected、private),也就是说,父类public的成员在子类中仍然是public的,父类protected的成员在子类中仍然是protected的。
(2)protected继承:
父类public类型的成员在子类中变为protected性质,protected的被继承依然是protected的。
(3)private继承:
父类所有成员在被子类中都变成或者保留为private性质的。
嗯,就这么简单。
********** 2016-8-16补充 ***********
今天看到《Datastructure and algorithm analysis in java》一书里面的两句话,觉得挺值得理解下的: