文章目录
- 1. 多态
- 2. 抽象类和纯虚函数
1. 多态
静态多态:
动态多态:
#include <iostream>
#include <string>
using namespace std;// 动物的基类
class Animal {
public:Animal(string name) : _name(name) {}virtual void bark() {}
protected:string _name;
};// 动物的实体类
class Cat : public Animal {
public:Cat(string name) : Animal(name) {}void bark() { cout << _name << "bark: miao miao!" << endl; }
private:int mb;
};class Dog : public Animal {
public:Dog(string name) : Animal(name) {}void bark() { cout << _name << "bark: wang wang!" << endl; }
private:int mb;
};class Pig : public Animal {
public:Pig(string name) : Animal(name) {}void bark() { cout << _name << "bark: heng heng!" << endl; }
private:int mb;
};/*
* 下面的一组bark API接口无法做到我们软件设计要求的“开-闭”原则
* 软件设计由六大原则 “开-闭”原则 对修改关闭,对扩展开放
*/
//void bark(Cat &cat) {
// cat.bark();
//}
//void bark(Dog &dog) {
// dog.bark();
//}
//void bark(Pig &pig) {
// pig.bark();
//}void bark(Animal *p) {p->bark();//Animal::bark虚函数,动态绑定了/*p->cat Cat vftable &Cat::barkp->dog Dog vftable &Dog::barkp->pig Pig vftable &Pig::bark*/
}int main() {Cat cat("猫咪");Dog dog("二哈");Pig pig("佩奇");//bark(cat);//bark(dog);//bark(pig);bark(&cat);bark(&dog);bark(&pig);return 0;
}
2. 抽象类和纯虚函数
抽象类和普通类有什么区别?
一般把什么类设计成抽象类? 基类
动物的基类 泛指 类 -> 抽象一个实体的类型
定义Animal的初衷,并不是让Animal抽象某个实体的类型
- string _name; 让所有的动物实体类通过继承Animal直接复用该属性
- 给所有的派生类保留统一的覆盖/重写接口
拥有纯虚函数的类,叫做抽象类!(Animal)
Animal a; No!!!
抽象类不能再实例化对象了,但是可以定义指针和引用变量。
#include <iostream>
#include <string>
using namespace std;// 汽车的基类
class Car {// 抽象类
public:Car(string name, double oil) : _name(name), oil(oil) {}// 获取汽车剩余油量还能跑的公里数double getLeftMiles() {// 1L 10 * oilreturn oil * this->getMilesPerGallon();// 发生动态绑定了}string getName() const { return _name; }
protected:string _name;double oil;virtual double getMilesPerGallon() = 0;// 纯虚函数
};class Bnze : public Car {
public:Bnze(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 20.0; }
};class Audi : public Car {
public:Audi(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 18.0; }
};class BMW : public Car {
public:BMW(string name, double oil) : Car(name, oil) {}double getMilesPerGallon() { return 19.0; }
};// 给外部提供一个同一的获取汽车剩余路程数的API
void showCarLeftMiles(Car &car) {cout << car.getName() << "left miles:" << car.getLeftMiles() << "公里" << endl; // 静态绑定 call Car::getLeftMiles()
}int main() {Bnze bl("奔驰", 20.0);Audi a("奥迪", 20.0);BMW b2("宝马", 20.0);showCarLeftMiles(bl);showCarLeftMiles(a);showCarLeftMiles(b2);/*奔驰left miles:400公里奥迪left miles:360公里宝马left miles:380公里*/return 0;
}