C++派生类的输出操作符重载

C++(03):在派生类里重载基类的虚拟函数 如果在派生类内重载了基类的虚拟函数: 可以看到,如果在派生类中重载了基类的虚拟函数,那么派生类的版本依然会掩盖基类版本的可见性。但是为什么通过指向派生类的基类指针调用的都是基类版本呢?个人认为:虚函数是通过虚函数表实现的,如果派生类重写了基类的虚函数,那么派生类中会将对应的虚函数表的虚函数地址更新为派生类中重写的虚函数,如果没有那么依然使用的是基类中的虚函数地址。但是对于派生类重载了虚函数这种情况,由于重载函数在基类的虚函数表中不存在,所以虚函数表中依然会保存基类虚函数的索引及地址,然后在派生类中会增加 阅读详情

操作符重载本身实现并不困难,例如

class  A

{

    friend ostream& operator<<(ostream& os,const class A& a);

    {

        os<<"value"<<a.value;

return os;

    }

private:

    int value;


};

 

但是如果A派生了新的类,为了能让同一个输出操作符自动识别继承自A类的对象并使用恰当的输出方式,则可以给基础类一个抽象的方法,派生类重写这个方法而达到针对不同的对象在运行时使用不同的输出格式.由于输出操作符不可以为抽象的,所以可以在不改变基类的这个公共接口的前提下另写一个实现输出的抽象成员方法print(),让输出操作符去调用这个方法.这样以来每派生一个类,则只需要修改其重写的print()方法即可.所以新的A类应该是

class A

{

    friend ostream& operator<<(ostream& os,const class A& a)

    {

        a.print(os);

        return os;

    }

private:

    int value;

    virtual void print() const;


};

void A::print(ostream& os) const

{

    os<<"value "<<value;

    return os;
}

如果此时B类继承了A类,则B的输出操作符可以在不对A的设计进行任何更改的情况下简单的实现.

B类的部分应该是如下的样子

class B: public class A

{

friend ostream& operator<<(ostream& os,const class B& b)

{

b.print(os);

return os;

}

private:

    int number;

    void print(ostream& os) const;
}; 

void B::print(ostream& os) const

{

    A::print(os);

    os<<"number "<<number;
}

这里的类都比较小,可以容易的看出当A,B类的输出都不叫复杂的时候改动和更改都会比较方便.

 

思想方法来自<<C++沉思录>>

TypeScript领域建模实战:基于斯坦福本体论七步法构建健壮数据模型 在软件工程中,领域建模是连接业务需求与技术实现的关键桥梁,其核心在于对业务概念、属性及其关系的显式定义与规范。通过系统化的建模方法,开发者能够将模糊的领域知识转化为清晰、可扩展且类型安全的数据结构,从而在编译时捕获潜在错误,提升代码质量与可维护性。这一过程的技术价值在于实现了从业务逻辑到类型系统的无损映射,确保了设计的一致性。在实践中,结合TypeScript的静态类型检查与Zod的运行时验证,可以构建起从概念到代码再到数据库的三层一致性约束。本文以电商、博客等常见应用场景为例,深入解析如何运用源自斯坦福知 阅读详情

相关推荐

新手必看!BUUCTF-PWN题实战:从零搭建Kali环境到成功RIP栈溢出

本文为CTF二进制安全新手提供了一份详实的BUUCTF-PWN入门指南。内容涵盖从零搭建Kali Linux环境、安装配置pwntools等核心工具,到深入浅出地讲解栈溢出原理与汇编基础,并手把手带领读者完成一道名为“rip”的经典栈溢出题目实战,成功利用漏洞获取系统权限。

t8u9v0w1x的博客 504

c++运算符重载,输出符号重载

运算符重载

u012332679的博客 2084

Linux USB设备命名规则

有一个USB设备,接到了Linux系统的终端的某个插口上,那么怎么找到这个设备对应设备路径呢?这个USB设备虚拟了多个功能(三个串口和一个网卡), 如何找到对应操作路径呢?

weixin_43132521的博客 1699

派生类和基类运算符重载

C++派生类和基类函数重载 有时候派生类和基类重载同一个函数,这个函数的调用过程需要传入基类,那么在子类中的重载函数应该怎么写呢 class Parent{ private: int a, b; public: Parent(int x, int y){ a = x; b = y; } friend ostream&amp;amp; ...

crispto的博客 3730

(超详细)Qt入门和配置Visual Studio的Qt环境

内容写了Qt入门,创建并编写第一个Qt程序,以及配置VS编写Qt程序的环境。(超级详细)

LY549826LY549264的博客 7679

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 762

C++(四):运算符重载与继承派生

一,继承与派生 新类继承旧类,A继承B,则A叫做B的派生类也叫子类,B是A的基类 A类包含了B类的所有成员函数 定义: class A : public B(以公有方式继承) 构造函数和析构函数没法继承 对于从基类继承过来变成私有成员的,还想用它可以通过派生类中(同函数名)重新定义成员达到覆盖基类成员。 基类成员继承过来在派生类属性的改变表:比如A以 protected 继承B类中的 publ...

Roe_D的博客 1007

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

C++的类、操作符重载与派生类

1、 类的基本概念 定义一个时间类,它能表示时、分、秒,并提供以下操作。编写程序测试类的功能。 (1)Time (int h, int m, int s);//构造函数(2) Time (Time const &x) //拷贝构造函数(3) void set(int h, int m, int s);//设置时间(4)Time & increment();//自动加1秒(5)void

洒满阳光的午后的博客 1344

Open3D 实现CSF布料模拟算法【2025最新版】

CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。

点云侠的博客 5746

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8528

C++以多态方式处理数组可能会遇到的问题

今天读《More Effective C++》时遇到一个条款:绝对不要以多态方式处理数组。以前自己也没有注意过,觉得有必要记录下来。 C++是允许通过base class的指针或引用来操作derived class所形成的数组的。但发生的事情可能会令你感到意外。下面举例说明: 基类和派生类是这样的: class BST /*ba...

weixin_33962621的博客 105

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

6-33.写出派生类构造方法(C++)

【代码】6-33.写出派生类构造方法(C++)

weixin_73121626的博客 911

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LX708 派生类构造之面向对象

提示:观察类的定义和main方法中的测试代码,补全缺失的代码。

2301_80004841的博客 600

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关乎C++期末复习的一些点

实验12 9.6-3 通讯录 试题分布: 15选择*2 10填空 24分 3编程 46分 不要乱画 只考1-9章 1.++ --右值,左值问题 3:二维数组作为函数参数传递时,一个要指定一行有多少列。要么是按照一位数组来处理,需要给出数组的num个数 需要区分int a[][] 和 int *a[] int **a 的区别。这三者是不一样的。包括对地址的const和非const也是不一样的。 4:命名空间的用和写;内联函数理解(类似宏,简单的代码替换,不可以有循环,判断等复杂结构);lam...

m0_46821706的博客 167

西北农林科技大学2024C++面向对象程序设计OJ——T14 形状类的设计与实现(虚函数与抽象类)

本文实现了一个形状类的继承体系,包含抽象基类CShape及其三个派生类CRectangle、CEllipse和CDiamond。通过动态创建对象数组,首先输出所有形状信息,然后比较并输出面积相等的形状,最后按面积从大到小排序输出结果。

2401_88567850的博客 796

C++课程作业作业之Ponit2D 和 Ponit3D类的创建

老师课上布置的作业 要求如下: (1)设计类Point2D,包含两个私有权限的double类型数据成员x和y,分别表示2D平面上点的x、 y坐标数值;( class Point2D ) (2)在Point2D类中包含两个参数的构造函数,构造函数的两个形参分别用以为数据成员x和y初始化;参数x、参数y的默认参数值分别为1.0、1.0;(3)在Point2D类中添加一个拷贝构造函数; (4) Point2D类中包含一个用以输出数据成员x和y的print()成员函数,完成其具体的实现; (5)完成Point2D类

Azxz0_0的博客 1531

c++ template class and the pattern to use its friends

template class may defined their friends template function, friend function or even friend class to aid it provide some functions.    But normally how do you implements the with the friends?   Let...

iteye_13882的博客 189

矩形类简单实现(c++)

#include #include using namespace std; class Rectangle //基类 { public: Rectangle(int x=0,int y=0,int h=0,int w=0) :xLow(x),yLow(y)

北海一刀的专栏 1211

遗忘随记/

1.std::strncpy(color, c, 39); //strncpy用于指定长度的字符串赋值到字符数组中

margaret522的博客 115

C++ namespace

#include <iostream> #include<string> #include<exception> #include"ClassBase.h" #include"ClassDerived.h" //using namespace addedClasses; // int main() { addedClasses:: ClassBase b(2); addedClasses::ClassDerived d(4); std::co.

zxcvb036的博客 100

【C++总结】

历年复试编程大题专栏

qq_42837890的博客 613

满足多态的操作符重载

操作符重载本身实现并不困难,例如 class A {     friend ostream&amp; operator&lt;&lt;(ostream&amp; os,const class A&amp; a);     {         os&lt;&lt;"value"&lt;&lt;a.value;     } private:     int value; }...

guoyiqi 101

7-4 时间模拟

c++ 类

weixin_62320071的博客 470
上一篇: Andrew Koenig 的一些建议 C++沉思录
下一篇: C++大师Stan Lippman:我对中国程序员的忠告
C++程序员Carea
博客等级 码龄18年 1590粉丝 878原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值