C++中面向对象的思想非常重要,也非常实用。类的继承特性是C++的一个非常重要的机制,它可以是使得在创建一个新类时,子类可以继承父类的数据成员和成员函数,仅需添加子类本身特有的成员。
关于C++继承有很多概念和问题容易混淆,在此总结一下,仅供参考。
一、继承方式
注意:在继承时,若不说明继承方式,则默认为private继承。
1、公有继承
其实公有继承不必多说,父类的public成员会继承到子类的public中,可以使用实例化的对象直接访问;父类的protected成员会继承到子类的protected中,可以能使用子类对象的成员函数或者父类的成员函数进行访问;而父类的private成员在子类中无法访问。
2、保护继承
对于保护继承方式来说,父类的public成员和protected成员都会继承到子类的protected中,可以使用子类对象的成员函数进行访问;而父类的private成员在子类中依然无法访问。
3、私有继承
对于私有继承方式来说,父类的public成员和protected成员都会继承到子类的private中,可以通过子类对象的成员函数进行访问;而父类的private成员在子类中依然无法访问。
二、隐藏
在继承时,若父类和子类中定义了同名的成员,在实例化子类B的对象b时,父类中同名的成员将被隐藏,默认情况下访问的是子类中的同名成员;若要访问父类A中的同名成员函数fun(),则只能通过b.A::fun()的方式进行。
三、多继承
若类C同时继承于类A和类B,则称为多继承。
//多继承
class C: public A, public B
{
...
};
四、多重继承
若类B继承于类A,且类C继承于类B,则称为多重继承。
//多重继承
class A
{
...
};
class B: public A
{
...
};
class C: public B
{
...
};
五、虚继承
在继承时,如果同时存在多继承和多重继承,就会出现菱形继承,如下:
class A
{
...
};
//多重继承
class B: public A
{
...
};
class C: public A
{
...
};
//多继承
class D: public B, public C
{
...
};
那么此时,若实例化类D的对象,那么类D的对象中就会有两份来自于类A的成员,此时,需要在多重继承之前使用virtual关键字进行修饰,才能保证类D的对象中,只有一份来自于类A的成员,这种继承方式称为虚继承,如下:
//虚继承
class B: virtual public A
{
...
};
class C: virtual public B
{
...
};