多态

66 阅读1分钟

多态

多态的基本概念

多态是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;
}