前言:
目录
2.2 override 和 final 关键字(C++11)
一、多态的概念
二、多态的实现
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 重载、覆盖(重写)、隐藏(重定义)的对比
三、抽象类
抽象类通常包含以下特点:
1、纯虚函数:抽象类中至少有一个或多个函数声明为 virtual 并且没有实现(即函数体为空,没有 = 0 后面的函数体),这些函数被称为纯虚函数(Pure Virtual Function)。例如:
class MyAbstractClass {
public:
virtual void abstractMethod() = 0; // 纯虚函数
};
2、继承:子类可以继承抽象类,但是不能直接实例化抽象类。子类必须实现抽象类中所有纯虚函数,否则子类也将成为抽象类。例如:
class DerivedClass : public MyAbstractClass {
public:
void abstractMethod() override; // 必须实现抽象方法
};
3、设计目的:抽象类通常用于为一组相关的类提供一个共同的行为框架,或者作为接口的定义,避免代码重复。
4、使用场景:抽象类常用于模式设计,如工厂模式、策略模式等,以及多态和模板编程中。
四、总结
感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!