首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】多态 ⑥ ( 函数重定义涉及的问题 - 子类覆盖父函数名 )

一、函数重定义涉及的问题 1、执行出错的代码 错误代码示例 : #include "iostream" using namespace std; // 父 class Parent { public...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 2、代码分析 在 Parent 父 中 , 定义了如下 3 个函数 , void fun(...C2661: “Child::fun”: 没有重载函数接受 3 个参数 ; 该错误是编译阶段报的错误 , 编译根本通不过 ; 3、错误原因分析 - 函数重定义问题 : 子类覆盖父函数名 错误原因分析..., 子类中已经存在 fun 函数了 , 子类 会 覆盖 父函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去父 查找 ; 子类查找函数 : C++ 编译器 在 子类中找到了 void...fun(int a, int b) void fun(int a) 两个函数 , 没有找到 3 个参数的函数 , 此时 C++ 编译器会报错 : error C2661: “Child::fun”

14620

c++对象(三)构造函数析构函数

构造函数是一种特殊的成员函数,它在创建对象时自动调用,其主要目的是初始化对象。在C++中,构造函数具有与其所属相同的名称,并且没有返回类型。...那么上面所示的代码构造函数如何写呢?...这在定义中是非法的,因为一旦定义了自己的构造函数(不管有多少参数),C++编译器就不会自动生成默认构造函数 我们这里也可以通过缺省参数来实现: 十分好用 2.1构造函数其他特性 如果类中没有显式定义构造函数...C++把类型分成内置类型(基本类型)自定义类型。...int main() { Date d1; return 0; } 答案是不可以 在Date中定义了两个构造函数,看起来目的是提供一个默认构造函数一个带默认参数值的构造函数

12410
您找到你想要的搜索结果了吗?
是的
没有找到

C++】多态 ⑪ ( 纯虚函数抽象 | 纯虚函数语法 | 抽象实现 | 代码示例 )

一、纯虚函数抽象 1、纯虚函数 纯虚函数 : 在 C++ 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父 中 声明 , 但是没有实现 ; 抽象 : " 纯虚函数...virtual void pureVirtualFunction() = 0; 3、抽象实现 " 抽象 " 就是在中定义了一个 " 纯虚函数 " , " 抽象 " 至少包含一个纯虚函数 , 抽象...的实现 ; " 抽象 " 代码示例 : // 定义了纯虚函数就是抽象 class AbstractClass { public: // 纯虚函数 virtual void...pureVirtualFunction() override { // 函数体 } }; 二、完整代码示例 抽象 的 核心作用 就是 使用 抽象类型指针 指向...子类对象 , 使用 抽象 指针 调用 纯虚函数 , 由于 父 的 纯虚函数没有实现 , 实际调用的 是 子类对象的 函数 , 该调用 发生了 多态 ; 代码示例 : #include "iostream

21830

C++对象】构造函数与析构函数

C++的默认成员函数包括: 默认构造函数(Default Constructor):当对象被创建时,如果没有显式地定义构造函数,则会调用默认构造函数来初始化对象。...C++的6个默认成员函数根据它们各自的作用特性可以被分为以下三: 2.构造函数 2.1概念 C++构造函数是用于初始化对象的特殊成员函数。它的名称与名相同,并且没有返回类型。...可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,所以C++提出了构造函数,构造函数是一个特殊的成员函数,名字与名相同,创建类型对象时由编译器自动调用...,代码可以通过编译,因为编译器生成了一个无参的默认构造函数 // 将Date中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成 // 无参构造函数,放开后报错:error...也就说在这里编译器生成的默认构造函数并没有什么用?? 理由如下: 首先C++把类型分成内置类型(基本类型)自定义类型。

10910

C++对象以及成员函数

参考链接: 如何通过C++函数传递返回对象? 一个实体拥有自己的属性行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是,属性是成员变量,行为是成员函数。 ...在C++中,结构体默认是全部都可见的,而中默认是私有的。 ...成员函数我们可以将它们定义在里,也可以定义在外,一般建议定义在外,在里进行声明即可,这样会使代码看上去更美观,代码不会过多,看上去头重脚轻。...那么中定义外定义有什么区别呢??  ①如果在中定义,在函数调用的时候编译器会当做内联函数处理,在调用点将代码展开;  ②如果在外定义,在函数调用时普通函数一样,进行栈桢的开辟回退。 ...)  1、构造函数(初始化对对象的内存地址空间)  构造函数名相同,构造函数可以重载。

1.3K20

C++友元函数友元

C++ 中,一个中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。...借助友元(friend),可以使得其他中的成员函数以及全局范围内的函数访问当前的 private 成员。 friend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些。...在 C++ 中,这种友好关系可以用 friend 关键字指明,中文多译为“友元”,借助友元可以访问与其有好友关系的中的私有成员。...友元函数 在当前以外定义的、不属于当前函数也可以在中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何的非成员函数,也可以是其他的成员函数。...友元函数可以访问当前中的所有成员,包括 public、protected、private 属性的。

15250

C++实现矩阵(附代码功能)

阅读这篇文章需要掌握C++的知识以及线性代数的知识,如果有疑问,可在文章下方评论,作者会尽快回复;本文是在作者阅读了平冈幸的程序员的数学3:线性代数之后而写,在代码设计上借鉴了书中的方法。...希望这些代码能够帮助你更好地理解线性代数里提到的矩阵运算,笔者所写的矩阵运算代码,都是初学C++时实现的,并不具有工程应用的价值;真诚的希望读者能够使用更好的矩阵运算库,比如Eigen,OpenCV等,...笔者对这两个C++库的理解也是比较深入的;当然,如果读者还了解Python的话,笔者建议学习numpy,numpy的Cpp代码可以在Github上搜索NumCpp。...初写这份代码时,笔者才刚入C++,如今笔者将在github上上传新的矩阵运算代码NANA https://github.com/YuruTu/NANA 相关文档见地址NANA doxygen生成文档...https://yurutu.github.io/NANA/files.html 具体实现的矩阵功能有: 最初版代码及其使用 利用C++实现矩阵的运算

1.4K10

C++对象之拷贝构造函数

前言 在前面学习了6个默认成员函数中的构造函数析构函数C++】构造函数析构函数详解,接下来继续往后看拷贝构造函数。 拷贝构造函数就是用一个同类型的其他对象来构造。...要学习拷贝构造函数,得先了解传值传参传引用传参。 2....特征 拷贝构造函数也是特殊的成员函数,其特征如下: 拷贝构造函数是构造函数的一个重载形式。 拷贝构造函数的参数只有一个且必须是类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。...注意:中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。...拷贝构造函数典型调用场景: 使用已存在对象创建新对象 函数参数类型为类型对象 函数返回值类型为类型对象 class Date { public: Date(int year, int minute

10610

C++C++ 中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析C++ 中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 中 , 定义了 void fun(int..., 其本质是修饰 第一个参数 Student* pThis 指针指向的内存空间 指针本身 ; 将 void fun(int age, int height) const 转换为 C 语言代码为...指针指向的内存空间 指针本身 // // C++ 编译器会将该函数转为 Student_fun(Student* pThis, int age, int height) // 使用 const...* pThis 指针指向的内存空间 指针本身 // // C++ 编译器会将该函数转为 Student_fun(Student* pThis, int age, int height) //...指针指向的内存空间 指针本身 // // C++ 编译器会将该函数转为 Student_fun(Student* pThis, int age, int height) // 使用 const

17920

代码洁癖系列(三):整洁的函数

前面我们讨论了什么样的命名更能够让你赏心悦目,今天来讨论一下面向对象编程过程中最重要的环节,编写函数。我们仍然用Java来演示,什么样的函数才算是整洁的。...首先讨论函数函数定义好了,也就容易了。 短小 相信大家在读代码的时候都会遇到过冗长的函数定义。...如果一个函数中做了太多的事,那么代码阅读起来的难度将会成倍增加,而且文档书写难度同样增大。还有就是给其他代码调用造成不便。比如我定义了函数A做了12两件事,函数B想做23,怎么办?...这时B只能再写一遍A中做2的代码。而这样就会有大量重复代码出现,不但增加工作量,对日后的维护工作也造成很大的负担。而把12分别定义为函数C函数D的话,只需要在AB中分别调用就可以了。...说完函数再来说一下如何写好一个。 还是短小 没错,也应该短小,不过这里短小的定义函数短小的定义稍有不同,我们通常以“权责”来衡量。先看下面这个

47830

C++友元函数友元的使用

1.友元介绍 在C++中,友元(friend)是一种机制,允许某个函数访问其他的私有成员。通过友元,可以授予其他函数对该类的私有成员的访问权限。...友元关系在一些特定的情况下很有用,例如在之间共享数据或实现特定的功能。 友元可以分为两种类型:友元函数友元。...在C++中,我们使用对数据进行了隐藏封装,的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供与外界的通讯接口。...友元的作用是提高了程序的运行效率(即减少了类型检查安全性检查等都需要时间开销),但它破坏了的封装性隐藏性,使得非成员函数可以访问的私有成员。...B ,各有一个私有整数成员变量通过构造函数初始化;A有一个成员函数Show(B &b)用来打印AB的私有成员变量,请分别通过友元函数友元来实现此功能。

22330

C++】内联函数 ③ ( C++ 编译器 不一定允许内联函数的内联请求 | 内联函数的优缺点 | 内联函数 与 宏代码片段对比 )

避免不必要的 开销 代码膨胀 ; 2、C++ 编译器 不一定允许内联函数的内联请求 由于 " 内联函数 " 会导致不必要的 开销 代码膨胀 , 因此 , C++ 编译器并不一定保证内联请求的成功...; 使用 inline 关键字 可以请求 C++ 编译器将函数进行内联 , 但是编译器并不一定会接受这个请求 ; 权衡利弊 : " 内联函数 "是否 成功内联 取决于 C++ 编译器 的 实现 优化策略...内联带来的性能提升 代码大小增加的开销 ; 3、是否内联决定权在编译器手中 是否内联决定权在编译器手中 : 在 C++ 语言中,inline关键字只是对编译器的建议,编译器可以根据自己的 优化策略...该 内联函数 作用 等同于 普通函数 ; 最终 内联函数 是否内联成功 , 由 编译器 决定 ; 二、内联函数 与 宏代码片段对比 1、内联函数 " 内联函数 " 的 本质是 函数 , 其是一种 特殊的函数...内联函数 就是 普通函数 , 当做 普通函数 进行调用处理 ; 2、宏代码片段 " 宏代码片段 " 本质 是 宏定义 ; 宏代码片段 是由 预处理器 进行处理 , 执行的操作是 简单的文本替换 ; 宏代码片段

16020

C++初阶与对象(二):详解构造函数析构函数

上次为与对象开了一个头:C++初阶与对象(一):学习与对象、访问限定符、封装、this指针 今天就来更进一步 1.的6个默认成员函数 如果一个中什么成员都没有,简称为空。...默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 今天就来主要聚焦于构造函数析构函数 2.构造函数 2.1引入概念 class Date { public: void Init...return 0; } 2.2.3特性5~7 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成 如果Date有自己定义的构造函数代码编译失败...解答:C++把类型分成内置类型(基本类型)自定义类型。...,如果Stack没有给构造函数,那Queue也是随机值了 无参的构造函数全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

17310

C++的复制构造函数赋值运算符

前言: C++面向对象的编程过程中,凡是在中运用到动态内存分配的时候总是会写一个显示的复制构造函数赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...除了直接看出来的一些表达式能满足以上两个条件,函数的按值传递(函数按值传递的是变量的副本)函数返回对象的情况也同时满足了以上两个条件。...TCHAR* argv[]) 45 { 46 Str s1("s1"); 47 show1(s1); 48 show2(s1); 49 return 0; 50 } 上述代码如果注释掉第...其实它默认的赋值构造函数差不多,都是进行浅复制。 4、还是浅复制造成的问题,下面举个例子 1 // 复制构造函数探索.cpp : 定义控制台应用程序的入口点。...程序中除了注意上述两点外还要注意构造函数写的是否全面,一开始写重载运算符=的时候忽略了下面这个构造函数中的strlen,导致Str s2后一直报错,晕。。。

1.1K70

c++对象(四)深入了解拷贝构造函数

,所以编译器不会生成默认构造函数 在这个代码中,由于 Time 中没有显式定义一个无参数的默认构造函数(只定义了一个拷贝构造函数),而 Date 的实现依赖于 Time 的这个默认构造函数来初始化其...但在创建 d1 时已经失败,因此这一步也无法成功执行 c++也可以加入这串代码进行强制生成: Time() = default; 1.3深拷贝 如果你没有为显式定义拷贝构造函数C++编译器会自动生成一个默认的拷贝构造函数...这会导致多个对象共享同一块内存空间,进而导致双重释放等问题 中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝 **浅拷贝(Shallow...C++ 默认的拷贝构造函数会逐个复制的成员,使用各成员自己的拷贝构造函数。...因此,q1 q2 在逻辑上是完全独立的队列,它们内部的栈互不影响 隐式拷贝构造函数:myqueue 在这段代码中并没有显式定义自己的拷贝构造函数

7610

C++对象】const成员函数及流插入提取

0; } const成员函数的作用是保证在函数内部不会修改的成员变量,从而更好地实现了的封装性安全性。...非const对象可以调用const成员函数 总结: 只读函数可以加const,其内部不涉及修改生成,便于const非const对象的调用;而涉及对象修改生成的函数就不可以加const。...3.流插入流提取运算符重载 在C++中,可以通过重载流插入流提取运算符(>)来自定义输入输出操作。 流插入运算符(<<)用于将数据插入到输出流中。...在C++中流插入提取操作符重载是不可以重载成成员函数,因为它们参数的顺序不可以改变,例如: 这是因为流插入第一个运算符是cout,而如果将其重载为成员函数第一个参数就是对象中隐含的this指针...const,因为其内部不涉及修改生成;取地址与const取地址这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载;此外流插入运算符流提取运算符通常都是以友元函数的形式定义在的声明内部

9310

C++声明成员函数定义 | 引用多个成员对象

C++声明成员函数定义的分离 在C++中,一般做法是将的声明放在指定的头文件中,程序员如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写的声明,以减少工 作量,提高编程的效率。 ...C++库有两种:  C++编译系统提供的标准库 自定义库,用户根据自己的需要做成的用户库, 提供给自己自己授权的人使用。...C++库包括两个组成部分: 声明头文件 已经过编译的成员函数的定义,它是目标文件。 案例:C++引用多个对象的成员。...上述代码,读者可以自己尝试优化一下,比如把输入输出单独抽取为一个方法。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~ C++声明成员函数定义 | 引用多个成员对象 更多案例可以go公众号:C语言入门到精通

1.8K83
领券