C++流类继承关系

图示

ios和 iostream不是缩写,而是不同的类!

ostream继承关系

复制代码
std::ios
             |
         std::ostream
             |
     ╭──────┼─────────╮
     ↓       ↓         ↓
std::cout  std::cerr  std::ofstream
(stdout)  (stderr)    (文件)
  • std::ostream是基类(输出流基类)

  • std::cout、std::cerr、std::ofstream等都是它的派生类

  • 基类引用可以绑定到任何派生类对象

在函数中定义一个ostream参数为基类,实际调用时,传入它的派生类,最终行使派生类的输出效果

cpp 复制代码
#include <iostream>
#include <fstream>
#include <sstream>

void writeToStream(std::ostream& os, const std::string& message) {
    // 此函数接收一个基类引用
    os << message;  // 这里调用的是虚函数,实际执行派生类的operator<<
}

int main() {
    // 1. 绑定到标准输出 (cout 是 ostream 的派生类对象)
    writeToStream(std::cout, "Hello, Console!\n");
    
    // 2. 绑定到文件输出流
    std::ofstream file("output.txt");
    writeToStream(file, "Hello, File!\n");
    
    // 3. 绑定到字符串流
    std::ostringstream ss;
    writeToStream(ss, "Hello, String Stream!");
    std::cout << "String stream contains: " << ss.str() << std::endl;
    
    return 0;
}

多重继承

一个类同时继承多个基类

cpp 复制代码
#include <iostream>

// 基类1
class 打印机 {
public:
    void 打印() {
        std::cout << "打印文档" << std::endl;
    }
};

// 基类2
class 扫描仪 {
public:
    void 扫描() {
        std::cout << "扫描文档" << std::endl;
    }
};

// 多重继承
class 多功能一体机 : public 打印机, public 扫描仪 {
public:
    void 复印() {
        扫描();
        打印();
        std::cout << "复印完成" << std::endl;
    }
};

int main() {
    多功能一体机 设备;
    
    设备.打印();  // 从打印机继承
    设备.扫描();  // 从扫描仪继承
    设备.复印();  // 自身方法
    
    return 0;
}

菱形继承问题

爸爸 继承 爷爷

妈妈 继承 爷爷

我 继承 爸爸和妈妈

结果:我有两个爷爷

虚继承

虚继承就是专门为解决菱形继承问题而设计的

爸爸 虚继承 爷爷

妈妈 虚继承 爷爷

我 继承 爸爸和妈妈

结果:我共享一个爷爷

当多个类需要共享同一个基类的状态时采用虚继承

相关推荐
死磕音视频2 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
WL学习笔记3 小时前
C & C++ 内存管理
c++·c++内存管理
顽疲4 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
宛 禾6 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
hetao17338376 小时前
联盟场-提高组-R7 & ZYZSC-S-Round 11
c++·算法
程序喵大人6 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)6 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
局部有解6 小时前
Hot100 - 三数之和
数据结构·c++·算法
学逆向的7 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全