ElevHe

博客园 首页 新随笔 联系 订阅 管理

多态分为两类:

1.静态多态:函数重载 和 运算符重载属于静态多态,复用函数名

2.动态多态:派生类和虚函数实现运行时多态

 

静态多态与动态多态的区别:

1.静态多态的函数地址早绑定 - 编译阶段确定函数地址

2.动态多态的函数地址晚绑定 - 运行阶段确定函数地址

 

#include <iostream>
using namespace std;

// 多态


// 动物类

class Animal {
public:
    virtual void speak() {
        cout << "动物会叫" << endl;
    }
};

class Dog: public Animal {  // Animal &animal = dog; 是允许的
public:
    void speak() {
        cout << "狗:汪汪" << endl;
    }
};

void Speak(Animal &animal) {
    animal.speak();
}

void test() {
    Dog dog;
    Speak(dog);
}

int main() {
    Dog dog;
    Speak(dog);
    // 由于函数早绑定,在编译阶段就确定了函数地址,所以输出结果为   动物会叫
    // 如果想执行Dog,那么这个函数地址应该晚绑定,在 Animal 中的 speak 前加 virtul 关键字
    // 添加 virtual 后,输出结果为 狗:汪汪
    return 0;
}

/*
动态多态满足条件
1.有继承关系
2.子类要重写父类中的虚函数,重写时可以不写 virtual 关键字

重写:函数返回值类型,函数名,参数列表,完全相同

动态多态的使用:
父类的指针或者引用执行子类对象
e.g Animal &animal = dog;


*/

 

指针只占用四个字节的空间

 

多态的优点:

代码组织结构清晰;可读性强;利于前期和后期的扩展和维护

 

在多态中,父类中的虚函数一般是无意义的,主要都是调用子类重写的内容,因此我们可以将虚函数改写为纯虚函数

virtual 返回值类型 函数名(参数列表) = 0;

当类中有了纯虚函数,那么这个类就被称为抽象类

抽象类特点

1.无法实例化对象  2.子类必须重写抽象类中的虚函数,否则也属于抽象类 

 

posted on 2023-04-16 16:10  ElevHe  阅读(23)  评论(0)    收藏  举报