(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,在运行时,可以通过指向基类的指针,来调用实现派生类中的方法,在C++中多态主要体现在运行和编译两个方面
C++中实现多态的方法有:虚函数、抽象类、重载、覆盖、模板
继承
继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西
三种继承关系:
保护限定符也是因继承而出现的
因为基类的私有成员在派生类中是不能被访问的,如果一些基类成员不想被基类对象直接访问,但需要在派生类中能访问,就定义为保 护成员
可以通过下面的测试对继承了解
继承与转换(public继承)
子类对象可以赋值给父类对象(切片)
父类对象不能复制给子类对象
父类的指针或引用可以指向子类对象
子类的指针或引用不能指向父类的对象(可以强制类型转换)
继承中,基类和派生类有独立的作用域
父类子类有同名成员时(函数只需要名字相同),子类将屏蔽父类对成员的直接访问——重定义(最要不要定义同名成员)
单继承&多重继承
单继承
一个子类只有一个直接父类时称这个继承关系为单继承
多继承
一个子类有两个或以上直接父类时称这个继承关系为多继承
菱形继承
在菱形继承中,Assistant类中会有两份Person成员,所以会存在二义性和数据冗余的问题
因此而有了虚继承,可以解决这些问题,虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间的问题。
虚函数&多态
虚函数: 类的成员函数前面加virtual关键字,则这个成员为虚函数。虚函数重写: 当在子类定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的这个虚函数。
总结
1、派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同(协变除外)
2、基类中定义了虚函数,在派生类中该虚函数始终保持虚函数的特性
3、只有类的成员才能定义为虚函数
4、静态成员不能定义为虚函数
5、如果在类为定义虚函数,只能在声明函数时加virtual,类外定义函数时不能加virtual
6、构造函数不能定义虚函数,最好不要讲operator=定义为虚函数,容易在使用时引起混淆
7、构造和析构函数里面不要调用虚函数,可能会因为对象不完整发生未定义的行为
8、最好把基类的析构函数声明为虚函数,编译器特殊处理后会构成覆盖