静态(编译时期)的多态:
1.函数重载
2.模板(函数模板、类模板)
动态(运行时期)的多态:
定义:在继承结构中,基类指针/引用指向派生类对象,再通过该指针调用同名覆盖方法(虚函数)。
基类指针指向哪个派生类对象就会调用哪个派生类对象的同名覆盖方法,称为『多态』
多态底层通过动态绑定实现。通过解引用访问到派生类对象,再通过对象中的vfptr访问它的vftable,再得到它的虚函数地址
#include<iostream>
#include<string>
using namespace std;
class Animal {
public:
Animal(string name):_name(name){}
virtual void bark() = 0;
protected:
string _name;
};
class Cat :public Animal {
public:
Cat(string name):Animal(name){}
void bark() {
cout << _name << ":meow" << endl;
}
};
class Mouse :public Animal {
public:
Mouse(string name) :Animal(name) {}
void bark() {
cout << _name << ":squeek" << endl;
}
};
class Dog :public Animal {
public:
Dog(string name) :Animal(name) {}
void bark() {
cout << _name << ":woof" << endl;
}
};
//通过引用的动态绑定
//下面的bark API接口无法做到软件设计要求的“开-闭”原则、高内聚低耦合
//“开-闭”原则:对修改关闭,对扩展开发。比如再增加或减少Animal类时也不用删掉bark API接口
/*
void bark(Cat& cat) {
cat.bark();
}
void bark(Mouse& mouse) {
mouse.bark();
}
void bark(Dog& dog) {
dog.bark();
}
*/
//多态
//做到了低耦合,不会随派生类改变而改变
void bark(Animal& p) {
p.bark();
}
int main() {
Cat cat("Tom");
Mouse mouse("Jerry");
Dog dog("Spike");
bark(cat);
bark(mouse);
bark(dog);
return 0;
}
继承与多态的意义:
1.代码的复用
2.在基类中提供统一的虚函数借口,让派生类进行重写,然后使用多态(设计一个基类指针指向不同的派生类对象)
抽象类:
//拥有纯虚函数的类叫做抽象类
//抽象类不能实例化对象,只能定义指针/引用变量
class Animal {
public:
Animal(string name) :_name(name) {}
//纯虚函数
//纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做
virtual void bark() = 0;
protected:
string _name;
};