前言:

目录

一、多态的概念

二、多态的实现

2.1 多态的构成条件

2.2 override 和 final 关键字(C++11)

2.3 重载、覆盖(重写)、隐藏(重定义)的对比

三、抽象类

四、总结


一、多态的概念

【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步-LMLPHP

二、多态的实现

2.1 多态的构成条件

在C++中,要实现多态,需要满足以下几个条件:

下面是一个简单的示例,展示了多态的构成条件:

#include <iostream>

class Base {
public:
    virtual void show() {  // 虚函数
        std::cout << "Base show()" << std::endl;
    }
    virtual ~Base() {}  // 虚析构函数
};

class Derived : public Base {
public:
    void show() override {  // 重写基类的虚函数
        std::cout << "Derived show()" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived();  // 基类指针指向派生类对象
    ptr->show();  // 调用派生类的show(),显示 "Derived show()"
    delete ptr;  // 正确调用析构函数
    return 0;
}

2.2 override final 关键字(C++11)

override 关键字

用法示例:

class Base {
public:
    virtual void display() const {
        // 基类实现
    }
};

class Derived : public Base {
public:
    void display() const override { // 明确这是一个重写的函数
        // 派生类实现
    }
};

如果不使用 override,编译器仍然可以正确地识别出重写的函数,但使用 override 可以让意图更加明确,并且能够检测出一些错误。

final 关键字
final 关键字用于阻止类被进一步继承,或者阻止虚函数被进一步重写。

final 用于类时,表示该类不能被继承。
final 用于虚函数时,表示该函数不能被派生类重写。

用法示例:

class Base {
public:
    virtual void display() const final {
        // 基类实现
    }
};

class Derived : public Base {
    // 下面的重写会失败,因为基类的 display 函数被标记为 final
    // void display() const override {
    //     // 派生类实现
    // }
};

class FinalClass final { // 这个类不能被继承
    // ...
};

// 下面的继承会失败,因为 FinalClass 被标记为 final
// class DerivedFromFinal : public FinalClass {
//     // ...
// }

使用 final 可以确保类的接口不会被意外地改变,这对于维护代码的稳定性和可预测性非常有帮助。

2.3 重载、覆盖(重写)、隐藏(重定义)的对比

【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步-LMLPHP

三、抽象类

抽象类通常包含以下特点:

1、纯虚函数:抽象类中至少有一个或多个函数声明为 virtual 并且没有实现(即函数体为空,没有 = 0 后面的函数体),这些函数被称为纯虚函数(Pure Virtual Function)。例如:

class MyAbstractClass {
public:
    virtual void abstractMethod() = 0; // 纯虚函数
};

2、继承:子类可以继承抽象类,但是不能直接实例化抽象类。子类必须实现抽象类中所有纯虚函数,否则子类也将成为抽象类。例如:

class DerivedClass : public MyAbstractClass {
public:
    void abstractMethod() override; // 必须实现抽象方法
};

3、设计目的:抽象类通常用于为一组相关的类提供一个共同的行为框架,或者作为接口的定义,避免代码重复。

4、使用场景:抽象类常用于模式设计,如工厂模式、策略模式等,以及多态和模板编程中。

四、总结

感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

【C++进阶学习】第四弹——多态——迈向C++更深处的关键一步-LMLPHP

06-26 07:26