C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式

int A(参数...) override { return 某个对象.A(参数...);}

一.目标

本文将用一个简单的"数学运算器"例子,从零解释以下 C++ 语法特性:

  • virtual 虚函数

  • override 重写关键字

  • 函数体内部的"转发调用"

  • 数组引用作为函数参数

适合初学者和希望加深理解的 C++ 编程者

二.背景:做一个"多种运算器"系统

我们希望定义一个统一的接口来支持不同的数学运算(加法、乘法等),用户只需调用统一的 calculate() 函数,不必关心底层具体做了什么。

第1步:定义接口类(抽象基类)
复制代码
class Calculator {
public:
    virtual int calculate(int a, int b, int (&results)[2]) = 0;
};

解释:

  • Calculator 是一个抽象类(或称接口类);

  • calculate() 是一个纯虚函数= 0);

  • 它接收两个整数 ab,并通过一个 长度为 2 的整型数组引用 results[2] 返回计算结果。

我们会让不同的"运算器"继承这个类,做不同的实现。

第2步:实现子类(加法器)
复制代码
class Adder {
public:
    int calculate(int a, int b, int (&results)[2]) {
        results[0] = a + b;   // 存入和
        results[1] = a - b;   // 存入差,顺便展示多结果
        return 0;
    }
};

这个类实现了自己的 calculate(),返回值为 0 表示成功,计算和差分别存入 results[0]results[1]

第3步:写一个代理类(封装 Adder 实现)

现在我们写一个类,它继承自接口类 Calculator ,但内部不直接做运算,而是把工作交给成员对象 Adder 完成

复制代码
class AdderWrapper : public Calculator {
    Adder adder; // 组合成员

public:
    int calculate(int a, int b, int (&results)[2]) override {
        return adder.calculate(a, b, results);
    }
};

|-----------------------------|-----------------------------------------------|
| 代码 | 含义 |
| : public Calculator | 表示该类继承自 Calculator 接口 |
| override | 明确声明我们在重写父类中的虚函数 |
| int (&results)[2] | 表示这是一个"长度为 2 的整型数组引用",可以被函数内部直接修改 |
| return adder.calculate(...) | 将输入参数"原封不动"转发给成员对象 adder 的同名函数处理,这是函数转发 |

这段代码的含义是:"我作为一个符合接口的类,但我把实际工作交给了我的内部成员对象去做。

第4步:示例
复制代码
#include <iostream>

void runCalculation(Calculator* calc) {
    int results[2];
    calc->calculate(10, 5, results);
    std::cout << "和: " << results[0] << ", 差: " << results[1] << std::endl;
}

int main() {
    AdderWrapper wrapper;
    runCalculation(&wrapper);
    return 0;
}

运行结果:

复制代码
和: 15, 差: 5

三.为什么用这种结构?

  • 模块化 :逻辑封装在 Adder 内部,AdderWrapper 只负责接口对接;

  • 解耦合 :可以轻松替换其他实现(如 Multiplier),而不改接口;

  • 可扩展:未来加新功能,只需添加新类即可;

  • 符合面向对象设计原则(依赖倒置、单一职责等);

四.完整示例代码

复制代码
#include <iostream>

// 1. 定义接口类(抽象基类)
class Calculator {
public:
    // 纯虚函数,要求子类必须实现
    virtual int calculate(int a, int b, int (&results)[2]) = 0;
};

// 2. 实现一个功能类:Adder(加法器)
class Adder {
public:
    int calculate(int a, int b, int (&results)[2]) {
        results[0] = a + b;   // 存储加法结果
        results[1] = a - b;   // 存储减法结果(为了示例展示多个结果)
        return 0;             // 返回状态码:0 表示成功
    }
};

// 3. 实现一个包装类:继承接口 + 转发调用
class AdderWrapper : public Calculator {
    Adder adder;  // 内部成员对象

public:
    // 使用 override 关键字表示重写接口类的虚函数
    int calculate(int a, int b, int (&results)[2]) override {
        return adder.calculate(a, b, results);  // 转发调用给内部的 adder 对象
    }
};

// 4. 使用者函数:统一调用接口类指针
void runCalculation(Calculator* calc) {
    int results[2];
    calc->calculate(10, 5, results);  // 调用接口函数
    std::cout << "和: " << results[0] << ", 差: " << results[1] << std::endl;
}

// 5. 程序入口
int main() {
    AdderWrapper wrapper;
    runCalculation(&wrapper);  // 输出: 和: 15, 差: 5
    return 0;
}

const & 说明它是只读引用,传入不会在函数里被修改。

相关推荐
Tipriest_1 小时前
C++ 中 ::(作用域解析运算符)的用途
开发语言·c++·作用域解析
Swift社区1 小时前
Java 常见异常系列:ClassNotFoundException 类找不到
java·开发语言
Tipriest_2 小时前
求一个整数x的平方根到指定精度[C++][Python]
开发语言·c++·python
闻缺陷则喜何志丹2 小时前
【有序集合 有序映射 懒删除堆】 3510. 移除最小数对使数组有序 II|2608
c++·算法·力扣·有序集合·有序映射·懒删除堆
蓝倾9763 小时前
淘宝/天猫店铺商品搜索API(taobao.item_search_shop)返回值详解
android·大数据·开发语言·python·开放api接口·淘宝开放平台
John_ToDebug3 小时前
从源码看浏览器弹窗消息机制:SetDefaultView 的创建、消息转发与本地/在线页通用实践
开发语言·c++·chrome
菌王5 小时前
EXCEL 2 word 的一些案例。excel通过一些策略将内容写入word中。
开发语言·c#
励志不掉头发的内向程序员5 小时前
STL库——list(类模拟实现)
开发语言·c++·学习
Swift社区5 小时前
Swift 解法详解:LeetCode 367《有效的完全平方数》
开发语言·leetcode·swift
蒋星熠6 小时前
Python API接口实战指南:从入门到精通
开发语言·分布式·python·设计模式·云原生·性能优化·云计算