C++多态实战指南:虚函数、动态绑定与纯虚函数
多态即“多种形态”。通常发生在继承层级中:基类指针/引用指向派生对象,调用成员函数时,实际执行哪个版本取决于对象真实类型,而非指针/引用静态类型。
静态绑定的缺陷演示
基类Shape含area(),派生Rectangle、Triangle各自重写。若area()非virtual:
class Shape { protected: int width, height; public: Shape(int a=0,int b=0):width(a),height(b){} int area() { cout<<"Parent class area:"<<endl; return 0; } };
class Rectangle: public Shape { public: Rectangle(int a=0,int b=0):Shape(a,b){} int area() { cout<<"Rectangle class area:"<<endl; return width*height; } };
class Triangle: public Shape { public: Triangle(int a=0,int b=0):Shape(a,b){} int area() { cout<<"Triangle class area:"<<endl; return width*height/2; } };
int main() {
Shape *shape;
Rectangle rec(10,7); Triangle tri(10,5);
shape = &rec; shape->area(); // 输出"Parent class area"
shape = &tri; shape->area(); // 输出"Parent class area"
return 0;
}
输出两行Parent class area。原因:编译期根据指针类型Shape*绑定基类版本——静态绑定(早期绑定)。
虚函数启用动态绑定
在基类area()前加virtual:
virtual int area() { cout<<"Parent class area:"<<endl; return 0; }
再次运行输出:
Rectangle class area
Triangle class area
编译器根据指针指向的实际对象类型动态分派——动态绑定(晚期绑定)。这是多态的核心机制。
虚函数
基类用virtual声明的函数。标志编译器:不希望静态绑定,期望运行时根据对象类型动态选择版本。实现动态链接/晚期绑定。
纯虚函数与抽象类
若基类无法给出有意义实现,但强制派生类实现,可声明为纯虚函数:
class Shape {
protected: int width, height;
public: Shape(int a=0,int b=0):width(a),height(b){}
virtual int area() = 0; // =0标记纯虚函数
};
含纯虚函数的类为抽象类,不能实例化对象,仅作为接口规范。派生类必须覆盖所有纯虚函数才能实例化,否则仍为抽象类。
C语言
- 掌握 C++ 运算符:六大类型全解析与实战示例
- C++数组传递给函数实战指南
- C++类与对象:面向对象编程实战指南
- C++ 友元函数与友元类:突破访问控制的利器
- C++ 类模板实战指南:编写灵活的类型无关代码
- C++ 运算符重载实战指南:语法、方法、限制与代码示例
- C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
- C++重载机制深度解析:函数重载与运算符重载全攻略
- C++数据抽象实战:接口与实现分离的设计艺术
- C++数据封装:守护代码安全的核心机制
- C++接口编程:抽象类与纯虚函数实现规范契约
- C# 继承完全指南:基类、派生类、初始化与多重继承替代方案