继承方式
- 公有继承
class A : public B
- 父类当中被public关键字修饰的成员变量或者方法都可以被继承在子类的public关键字下;
- 父类中被protected关键字修饰的成员变量或者方法,都可以被继承在子类的protected关键字下;
- 父类中被private关键字修饰的成员变量或者方法,被继承在子类不可见区域,而不是子类的private关键字下。意味着父类的私有成员函数不能被子类继承并使用。
- 保护继承
class A:protected B
- 私有继承
class A: private B
继承中的特殊关系
隐藏
父子关系、成员同名、隐藏
参数不同无法形成重载,只能进行隐藏:这就意味着在子类对象调用一个方法时,只会调用到子类的该方法,而不能调用到父类的同名的方法。
int main(void)
{
Soldier soldier;
soldier.play(); //调用的子类的play()方法
soldier.Person::play(); //调用的父类Person类的play()方法
return 0;
}
is-A
继承是is-A的关系,组合是has-A的关系,例如隐形眼镜是一个眼镜,沙发的组成中包含沙发垫。
- 虚析构函数
当存在继承关系时,使用父类的指针去指向堆中的子类的对象,并且想使用父类的指针去释放内存,这个时候需要虚析构函数。
//了解一个关键字virtual
virtual ~Person();
//这个关键字会被继承下去的
C++多继承和多重继承
多重继承
举个简单例子就是人类-士兵-步兵
class Person{};
class Soldier:public Person{};
class Infantryman:public Soldier{};
多继承
有一个类不仅继承了这个类的同时,也继承了另一个类,就是一个类同时继承了多个类。一个子类同时有两个或者以上的父类。
class Worker{};
class Farmer{};
class MigrantWorker:public Worker, public Farmer{};
虚继承
- 多继承&多重继承带来的问题:
实例化D对象的时候,D中将会拥有两份完全一样的A的数据。菱形继承关系用什么可以解决数据冗余的问题呢,就会用到虚继承。 - 关键字:virtual来完成虚继承
class Worker:virtual public Person{};
class Farmer:virtual public Person{};
//使用时,MigrantWorker类如下
class MigrantWorker:public Worker,public Farmer{};
重定义问题
通过宏定义来解决重定义问题;
在菱形定义问题中,这个问题是一定会出现的。
#ifndef PERSON_H
#define PERSON_H
...//代码
#endif