C++ (菱形继承,通用接口 ,多态介绍)
菱形继承
class A{public :int a;};class B:public A{};class C:public A{};class D:public B,public C{public:void function(){a=200;} };int main(){D object;// object.a=100; 如果如此使用会产生报错 会导致一个成员在类D中出现两次,产生歧义,浪费空间object.C::a = 100; //解决方法:通过类名来明确要访问的是哪一个成员return 0;
}
通用接口
需求:设计一个玩游戏时选角色的接口
方法:1.给每个英雄提供一个函数接口
void playGamesByHanxin(Hanxin &hx);void playGamesByZhongkui(Zhongkui &zk);void playGamesByDirenjie(Direnjie &drj);
2 通过函数重载的形式提供函数接口
void playGames(Hanxin &hx);void playGames(Zhongkui &zk);void playGames(Direnjie &drj);
在C++中可以使用父类的引用来引用子类的对象,也可以使用父类的指针来指向子类的对象,反过来则不行
Hanxin hx;Hero &hero1 = hx; //hx是一个英雄/*Hero hero1;Hanxin &h=hero1; //英雄不是Hanxin*/
一种接口的多种实现
1.父类的函数接口是用virtual关键字修饰变成虚函数
class Hero{public: virtual void skill(void);};
2.子类继承父类,对父类的函数接口进行重写
class Hanxin:public Hero{public:virtual void skill(void);};class Zhongkui:public Hero{public:virtual void skill(void);};class Direnjie:public Hero{public:virtual void skill(void);};
父类的引用来引用子类的对象或父类的指针来指向子类的对象
void playGame(Hero &hero){ hero.skill();//此时hero引用哪一个子类对象,就会这个子类对象的skill方法
}
多态的介绍
不同的对象接收到同一消息的时候,产生不同的效果
在面向对象中,多态是指通过父类的指针或者引用指向子类的对象,在运行时动态调用实际绑定对象函数的行为,即“一个接口,多种实现”
静态多态是编译器在编译期间完成的,编译器会根据实参数量来选择调用合适的函数,如果有合适的函数就调用,没有的话就会警告或报错
动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数
多态的作用 : 把不同的子类都当父类来看待,可以屏蔽不同子类对象之间的差异来写出通用的代码,做出通用的编译以适应需求的不断变化
多态是设计模式的基础,多态是框架的基础
前提条件
要有继承
要用虚函数重写(被virtual声明的函数叫做虚函数)
要有父类指针(父类引用)指向子类对象
实现步骤
基类(父类)里面的方法是用 virtual关键字修饰,变成虚函数
子类继承父类重写父类里面的虚函数
用父类的指针或引用指向子类对象
通过父类指针或引用调用子类重写父类方法