扩展性:子类可以继承父类的功能,并在此基础上扩展或重写,满足更多需求。 缺点: 紧密耦合:继承会导致类之间的紧密耦合,子类对父类的依赖较强,修改父类可能影响子类的行为。...多态的两种类型: 编译时多态(静态多态):在编译时决定调用哪个函数,常见的实现方式是方法重载(Overloading)和运算符重载(Operator Overloading)。...编译时多态与函数重载 编译时多态指的是在编译阶段就可以确定调用哪个函数。编译时多态通常通过函数重载和运算符重载实现。 3.1....运算符重载(Operator Overloading) C++允许我们为自定义类型重载运算符,这也是一种编译时多态的表现。...+ 运算符 c3.print(); // 输出: 4 + 6i return 0; } 代码解析: 运算符重载:我们重载了 + 运算符,使其可以对 Complex 类型的对象进行加法操作
C++的继承不仅仅是一个简单的“类与类之间的关系”,它涉及到如何组织和管理对象之间的共享数据、方法以及如何利用多态实现代码的灵活性。...C++的继承机制正是通过类与类之间的继承关系来模拟这些现实中的关系。继承使得开发者能够从一个基类派生出多个派生类,从而共享基类的行为,并在需要时对其进行扩展或修改。...同样,赋值运算符的调用顺序也遵循这一规则:基类的赋值运算符会先于派生类的赋值运算符被调用。...<< endl; } //赋值运算符重载 Student& operator=(const Student& s) { Teacher::operator=(s);//先调用基类的赋值运算符重载...从结果可以看出基类的拷贝构造和赋值运算符重载优先级优于派生类。为了保证派生类对象的完整性,派生类的拷贝构造函数和赋值运算符必须调用基类的相应函数,确保基类成员正确处理。
它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展....运算符重载函数作为 类成员函数 与 友元函数(形参必须有要求) 一般将单目运算符和复合运算符重载为成员函数 一般将双目运算符重载为友元函数; 重载双目运算符 C++构造函数的重载 在一个类中可以定义多个构造函数...如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。...需要说明;有时在基类中定义的非虚函数会在派生类中被重新定义(如例12.1中的area函数),如果用基类指针调用该成员函数,则系统会调用对象中基类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数...它的作用只是定义了一个虚函数名,具体功能留给派生类去添加。 使用虚函数,系统要有一定的空间开销。
成员声明列表中包含类成员变量以及成员函数,是派生类新增的成员。 “:”是一个运算符,表示基类和派生类之间的继承关系。...C++中的继承有以下几种类型: 公有继承(public inheritance):派生类继承了基类的公有成员和保护成员,并且这些成员在派生类中的访问权限与基类中的一样。...通过继承,派生类可以继承基类的接口和实现,并且可以添加自己的功能或修改基类的行为。 继承是面对对象的主要特性之一,它使一个类可以从现有类中派生,而不必重新定义一个类。...C++中的多态性主要通过虚函数(virtual function)和运行时类型识别(runtime type identification)两个机制来实现: 虚函数:在基类中声明虚函数,并在派生类中进行重写...多态的实现 静态绑定:在编译期决定 函数重载 运算符重载 模板 动态绑定:在程序运行时执行 虚函数 虚函数概念: 在基类中冠以关键字virtual的成员函数 定义: virtual函数类型
分别为: 函数重载和运算符重载,运算符重载后续讨论,这里讨论函数重载。英文是overload,和c++的基本类似。 重载有一点是特别注意:不能通过返回值来重载,只能通过函数的参数进行重载。...* 说白了,子类调用Draw()的使用是调用了基类的Draw().并没有实现多态的功能 如果使用上面的宏定义 输出是 画一个长方形 执行基类的画图任务 画一个三角形 执行基类的画图任务 画一个圆形...覆盖父类中用 virtual 申明的虚方法时, * 实例化父类调用该方法,执行时调用的是父类中的虚方法 * * override是重写,即将基类的方法在派生类里直接抹去重新写,故而调用的方法就是子类方法...静态多态性:编译时发生函数响应(调用); 动态多态性:运行时发生函数响应。 静态绑定(早期绑定):编译时函数和对象的连接机制。两种技术实现静态多态性:函数重载/运算符重载。...3.2、函数重载:在同一范围内对相同函数名有多个定义,可以是参数类型或参数个数的不同,但不许只有返回值类型不同。 运算符重载,这个后续在讨论。
不要滥用运算符重载 ---- 4.5.2 左移运算符重载 ---- 作用:可以输出自定义数据类型 注意 :一般使用全局函数实现 示例 //全局函数实现左移重载 #include ...(){ point_son p1(10); //继承中 先调用基类构造函数,再调用派生类构造函数,析构顺序与构造相反 return 0; } 总结:继承中 先调用基类构造函数...,再调用派生类构造函数,析构顺序与构造相反 ---- 4.6.6 继承同名成员处理方式 ---- 问题:当派生类与基类出现同名的成员,如何通过派生类对象,访问到派生类或基类中同名的数据呢?...问题:继承中同名的静态成员在派生类对象上如何进行访问?...> 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们 ---- 5.1文本文件 -
是关键字,+就是我们想要重载的运算符 ; (5)上面的这个运算符重载的基本写法,实际上这个运算符的重载既可以写作成员函数,也可以写作全局函数,当我们实现一个类和一个整形数据加法的时候,如果我们写在成员函数里面...:赋值运算符= 函数调用运算符( ) 下标运算符[ ] 以及这个指针访问成员操作符-> ; 2.四种运算符重载 (1)关系运算符的重载 关系运算符就是我们常说的这个大于小于和等于这些符号的比较...张三比李四的分数高" << endl; } } return 0; } (2) 左移运算符的重载 这个cout有15种重载,因此可以输出各种数据类型的数据,但是cout无法输出我们自己定义的类和对象...,不能写成成员函数; (3)下标运算符的重载 如果没有重载下标运算符,如果我们想要查看这个数组元素,我们就需要自己定义函数,使用这个小括号加上下标的方式表示,但是我们知道这个访问操作符就是中括号,因此下面我们介绍小标访问运算符的重载...多态就是我们定义了两个类之间的继承关系,定义了基类的指针pa,指向的是派生类的对象g,这个时候我们使用这个指针去调用函数,就只能调用基类的构造函数,因为这个指针就是基类的; 我们在这个基类的成员函数show
公有继承(public) 继承的访问控制 基类的public和protected成员:访问属性在派生类中保持不变 基类的private成员:不可直接访问 访问权限 派生类中的成员函数:可以直接访问基类中的...成员 通过派生类的对象:不能直接访问从基类继承的任何成员 保护继承(protected) 继承的访问控制 基类的public和protected成员:都以protected身份出现在派生类中 基类的private...不需要显式地调用基类的析构函数,系统会自动隐式调用 先执行派生类析构函数的函数体,再调用基类的析构函数 访问从基类继承的成员 当派生类与基类中有相同成员时: 若未特别限定,则通过派生类对象使用的是派生类中的同名成员...注意: 在第一级继承时就要将共同基类设计为虚基类 虚基类及其派生类构造函数 建立对象时所指定的类称为最远派生类 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的 在整个继承结构中...++、--除外) 至少应该有一个自定义类型的参数 后置单目运算符 ++和--的重载函数,形参列表中要增加一个int,但不必写形参名 如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元
)双目运算符重载为成员函数 当重载运算符为双目运算符时,形参表中只有一个参数作为右操作数。...(3)单目运算符重载为成员函数 此时参数表中没有参数,只有当前对象作为运算符的一个操作数。...(3) 友元函数重载+重载输入输出流(用的稀烂用的多比较重要) 在左右操作数类型不同时上述重载方式都不能正常使用,这时候就需要两个操作数,在类外重载,因类外不能直接调用,所以要把该函数声明为类的友元。...用非类A类型的值为类A的对象赋值时(当然,这种情况下我们可以不提供相应的赋值运算符重载函数,而只提供相应的构造函数,如更有重载函数会优先调用重载后的赋值运算符)。...(2)派生类的生成过程 吸收基类成员:除构造和析构函数外 改造基类成员:通过在派生类中定义同名成员屏蔽基类成员在派生类中直接调用,仍可以基类指针调用同名成员 .添加新成员 (3)派生类特点 子类拥有父类除了父类构造和析构函数
/cpp-classes-objects.html ---- 目录 类和结构体的区别 类的创建 构造/析构函数 友元函数 内联函数 类的静态成员 类访问修饰符 继承 特点 基类/派生类 多继承 运算符/...我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。...<< Rect.getCost(area) << endl; return 0; } ---- 运算符/函数重载 当调用一个重载函数或重载运算符时,编译器通过把所使用的参数类型与定义中的参数类型进行比较...选择最合适的重载函数或重载运算符的过程,称为重载决策。...在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
继承 16.1 基本知识 继承: 派生类(子类)继承基类(父类)的成员函数和数据成员,并在此基础上可以构建自己的成员函数和数据成员。...public成员,不能访问private、protected成员 不管哪种继承方式,父类的私有成员都不可以访问 派生类的构造: 会依次调用父类的构造函数,析构与构造顺序相反。...这确保在使用基类指针指向派生类对象时,可以正确调用派生类的析构函数,避免内存泄漏。 纯虚函数: 纯虚函数本身在基类中没有具体的实现,而是在派生类中被强制要求实现。...; return 0; } ⛳️第十八章 运算符重载 18.1 基本知识 运算符重载 优先级和结合性、操作个数保持不变。...不能重载运算符:点操作(.)、域操作(::)、条件操作符(?)
典型的例子包括函数重载、运算符重载和模板。 运行时多态(动态多态):在程序运行期间决定调用的函数。主要通过虚函数(virtual function)机制实现。...这样,任何派生类都可以重写这个函数,并在运行时通过基类指针或引用调用派生类的实现。...2.5 覆盖、隐藏与重载(易混淆点解析) 在多态中,理解覆盖、隐藏和重载的区别非常重要: 覆盖(Override):派生类重新定义基类中声明为 virtual 的函数,函数签名相同。...这种返回值的变化称为协变(Covariance)。 2.6.2 协变的使用示例 协变通常用于在继承关系中,返回更加具体的派生类类型,从而让调用者能够获得更加明确的对象类型。...然而,多态的神奇远不止于此。接下来,我们将一起深入探讨多态背后的实现原理,揭开虚函数表(VTable)如何实现动态绑定的奥秘,以及如何在多重继承的复杂关系中应对多态的挑战。
运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。 流插入运算符 添加一个换行符。...当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。...在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。...让我们举一个现实生活中的真实例子,比如一台电视机,可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD 播放器),但是我们不知道它的内部实现细节,也就是说,我们并不知道它是如何通过缆线接收信号...cout << "Hello C++" <<endl; return 0; } 在这里,暂时不需要理解 cout 是如何在用户的屏幕上显示文本。
作者有个自己的想法,如果C语言编写开发中,能把面向对象的思想添加进去,可以让代码更加美观,更加简洁,特别是代码复用。要让代码实现《高内聚、低耦合》,这样写代码才比较有意义。...因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。...2.基类的重载运算符。 3.基类的友元函数。 继承类型:当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。 流插入运算符 添加一个换行符。...当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。...在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。...让我们举一个现实生活中的真实例子,比如一台电视机,可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD 播放器),但是我们不知道它的内部实现细节,也就是说,我们并不知道它是如何通过缆线接收信号...<< "Hello C++" <<endl; return 0; } 在这里,暂时不需要理解 cout 是如何在用户的屏幕上显示文本。
运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。 流插入运算符 添加一个换行符。...当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。...在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。...让我们举一个现实生活中的真实例子,比如一台电视机,可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD 播放器),但是我们不知道它的内部实现细节,也就是说,我们并不知道它是如何通过缆线接收信号...<< "Hello C++" <<endl; return 0;} 在这里,暂时不需要理解 cout 是如何在用户的屏幕上显示文本。
:"条件运算符 这五个不可重载 //重载不会改变运算符优先级 //重载双目运算符 "==" ">" "<" //要构建一个String 类,重载函数以友元函数的形式出现在类中,双目符重载函数作为成员函数报错...类型,private不变 //在基类、派生类中是一种public般的存在 //在类外,是private般的存在 }; //多重继承派生类的构造函数(构造函数参数表写法) //格式如下...:解决多继承中存在的二义性 //例子:A派生B、A派生C、D继承了B、C ,此时A的成员都public,在D中修改a的成员数据,存在一个二义性,修改的是从B还是从C继承过来的A呢 class A class...,内容呈现动态化,一旦有新的定义,就可以在该派生类中用虚函数调用 //虚函数要和基指针结合使用 //基指针:基类类型指针,可以指向基类,也可以指向由它的派生类抽象而来的实例,但是也只能调用基类继承过来的函数...//只使用基指针调用派生类,并不会调用继承过来被覆盖的结果,还是会调用在基类中该函数的内容 #include class Pet //基类 {public: void
运算符重载:可以对运算符进行重载,使它们能够用于类的实例。...重载了+运算符使其可以对复数类进行操作。...虚函数和继承 运行时多态的核心是虚函数。在基类中使用virtual关键字声明一个函数,派生类可以重写该函数,当通过基类指针或引用调用这个函数时,会自动调用派生类中的实现。...0; } 在上面的代码中: Animal是基类,Dog和Cat是从Animal继承的派生类。...而重载的分派发生在编译时,由编译器根据传入的参数选择哪个函数进行调用,因此它属于静态多态。 虚函数的覆盖不是通过继承和虚函数机制来实现的,而是通过在类中定义多个同名函数,来实现对不同参数的处理。
领取专属 10元无门槛券
手把手带您无忧上云