多态
多态的基本概念
多态是C++面向对象三大特性之一
多态分为两类
- 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
- 动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
class Animal{
public:
virtual void speak(){
std::cout << "Animal speaks" << std::endl;
}
};
class Cat : public Animal{
void speak(){
std::cout << "Cat speaks" << std::endl;
}
};
class Dog : public Animal{
void speak(){
std::cout << "Dog speaks" << std::endl;
}
};
void test_speak_case(Animal& obj){
obj.speak();
}
int main(){
Cat cat;
Dog dog;
test_speak_case(cat); // 输出 "Cat speaks"
test_speak_case(dog); // 输出 "Dog speaks"
return 0;
}
总结:
多态满足条件
- 有继承关系
- 子类重写父类中的虚函数
多态使用条件
- 父类指针或引用指向子类对象
重写:函数返回值类型 函数名 参数列表 完全一致称为重写
多态案例一-计算器类
案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:
- 代码组织结构清晰
- 可读性强
- 利于前期和后期的扩展以及维护
class BaseCalc{
public:
virtual int add(int a, int b);
virtual int minus(int a, int b);
virtual int multiply(int a, int b);
virtual int divide(int a, int b);
};
class AddMethod : public BaseCalc{
public:
int add(int a, int b){
return a + b;
}
};
int test_virtual(BaseCalc* bc, int a, int b){
return bc->add(a, b);
}
int main(){
BaseCalc* bc = new AddMethod();
std::cout << test_virtual(bc, 1, 2) << std::endl; // 输出3
return 0;
}