图示

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;
}
菱形继承问题
爸爸 继承 爷爷
妈妈 继承 爷爷
我 继承 爸爸和妈妈
结果:我有两个爷爷
虚继承
虚继承就是专门为解决菱形继承问题而设计的
爸爸 虚继承 爷爷
妈妈 虚继承 爷爷
我 继承 爸爸和妈妈
结果:我共享一个爷爷
当多个类需要共享同一个基类的状态时采用虚继承