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

意外输出(虚函数返回字符串)

基础概念

在C++中,虚函数(Virtual Function)是一种允许在派生类中重新定义基类函数行为的机制。虚函数通过使用virtual关键字声明,使得在运行时可以动态地调用派生类中的实现,而不是基类中的实现。这种机制是多态性的基础。

相关优势

  1. 多态性:虚函数允许通过基类指针或引用调用派生类的函数,实现运行时多态。
  2. 代码复用:通过基类和派生类的继承关系,可以复用基类的代码。
  3. 扩展性:可以在不修改基类代码的情况下,通过派生类添加新的功能。

类型

虚函数可以是成员函数,也可以是静态成员函数,但通常指的是非静态成员函数。

应用场景

虚函数常用于以下场景:

  • 基类设计:当设计一个基类,希望其派生类能够重写某些函数时。
  • 多态行为:当需要通过基类指针或引用调用派生类的特定行为时。

问题描述

意外输出(虚函数返回字符串)通常是指在通过基类指针或引用调用虚函数时,期望得到派生类的字符串输出,但实际输出了基类的字符串。

原因

  1. 未正确重写虚函数:派生类中未正确重写基类的虚函数,导致调用的是基类的实现。
  2. 对象切片问题:当通过值传递派生类对象给函数时,可能会发生对象切片,导致实际调用的是基类的函数。
  3. 指针或引用类型错误:使用错误的指针或引用类型调用虚函数,导致调用的是基类的实现。

解决方法

  1. 确保正确重写虚函数
    • 在派生类中使用override关键字明确重写虚函数。
    • 确保派生类中的函数签名与基类中的虚函数完全一致。
    • 确保派生类中的函数签名与基类中的虚函数完全一致。
  • 避免对象切片
    • 使用指针或引用传递派生类对象,而不是通过值传递。
    • 使用指针或引用传递派生类对象,而不是通过值传递。
  • 确保正确的指针或引用类型
    • 确保通过基类指针或引用调用虚函数时,实际指向的是派生类对象。
    • 确保通过基类指针或引用调用虚函数时,实际指向的是派生类对象。

参考链接

通过以上方法,可以有效解决虚函数返回字符串时的意外输出问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Python 字符串中返回bool类型的函数集合

    字符串中返回bool类型的函数集合 isspace 功能: 判断字符串是否是由一个空格组成的字符串 用法: booltype = string.isspace() -> 无参数可传 ,返回一个布尔类型...注意: 由空格组成的字符串,不是空字符串 : “’!...=‘’’ istitile 功能: 判断字符串是否是一个标题类型 用法 booltype = String.istitle() -> 无参数可传, 返回一个布尔类型 注意: 该函数只能用于英文 isupper...与islower 功能: isupper判断字符串中的字母是否都是大写 islower判断字符串中的字母是否都是小写 用法: booltype = string.isupper() -> 无参数可传..., 返回一个布尔类型 booltype = string,islower() ->无参数可传 ,返回一个布尔类型 注意: 只检测字符串里的字母,对其他字符不做判断 join与split 稍后见 我们数据类型转换的时候见

    2.4K20

    C++返回指针值的函数 | 按字母顺序由小到大输出

    C++返回指针值的函数 在C++中,一个函数可以带回一个整型值、字符值、实型值 等,也可以带回指针型的数据,即地址,带回的值的类型是指针类型,返回指针值的函数简称为指针函数。 ...一维指针数组的定义形式为  类型名 *数组名 [数组长度]; int *point[5]; 可以用指针数组中各个元素分别指向若干个字符串,使字符串处理更加方便灵活。...经典案例:C++实现若干字符串按字母顺序由小到大输出。...(name,number);//调用print函数    return 0; //函数返回值为0;  }  void sort(char *name[],int number)//自定义排序函数  {...C++返回指针值的函数 | 按字母顺序由小到大输出 更多案例可以go公众号:C语言入门到精通

    1.5K2118

    【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一、字符串翻转模型 业务函数 二、完整代码示例 一、字符串翻转模型 业务函数 ---- 将上一篇博客 【C 语言】字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数...; 字符串翻转模型 业务函数 要点 : 形参返回值 : 函数的返回值 , 一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 char *str 是返回值 ; int inverse(char *...str) 函数返回值 : 函数的返回值 , 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 函数形参处理 : 在 函数中 , 如果涉及到修改 形参 指针变量 , 一般不直接使用形参...: 函数的第一项任务就是 判定 形参指针是否合法 , 如果任何一个指针为空 , 直接返回 -1 ; // 判断传入的字符串指针是否为空 if(str_tmp == NULL)...*/ int inverse(char *str) { // 创建临时变量接收 函数形参 , 不要直接改变形参的函数指向 char *str_tmp = str; // 判断传入的字符串指针是否为空

    93210

    C语言中的函数为什么只能有一个返回值输出?怎么实现多个值输出?

    这是典型的C语言中函数模块中的返回值问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非常重要的角色,C语言在很多领域还是首选编程语言...常见的C语言难点有指针,结构体,函数,递归,回调,数组等等,看起来没多少东西,每个概念都能延伸很多功能点,今天的题目其实就是函数模块中的返回值的问题,面向对象编程的基本单元就属于函数,函数包括参数输入,...具体功能实现,最后是结果的输出,也就是这个题目的返回值,在正常情况下函数的返回值只有一个,但在实际编程中需要用到多个,在设计时候还是归结成一类,如果类型相近可以弄成数组方式,如果类型不太一致直接放在结构体中执行...2.结构体指针返回 结构体是C语言涉及数据结构的最直接的容器,通常在编程过程中实现一个功能模块,模块中的数据通常都会放在一个结构体中,在在功能函数中对结构体中的数值进行操作,因为结构体中可以放足够多的变量...,如果函数返回值是个指针的话,就能把整个结构体里面的内容返回出来,同样能够达到返回多个数值的作用,这种在平常的编程过程中用的最多,C语言中使用最频繁的关键点就是指针了,但也是很多初学者最不好理解的知识点

    7.5K30

    python全栈开发《26.字符串中返回bool类型的函数集合》

    之所以说它是集合,是因为我们有多个函数,都会返回布尔类型。 1.isspace 功能: 1)判断字符串是否是一个由空格组成的字符串。...,不等于空字符串。...2.istitle 功能: 1)判断字符串是否是一个标题类型。 标题类型:比如有多个单词,每个英文单词的首字母都是大写,其余字母都是小写。这种字符串就是标题类型。...bin/python /Users/llq/PycharmProjects/pythonlearn/pythonlearn1/1.py True False 进程已结束,退出代码为 0 注意: 该函数只能用于英文...3.isupper与islower 功能: 1)isupper:判断字符串中的字母是否都是大写。 2)islower:判断字符串中的字母是否都是小写。

    6710

    python061_如何接收输入_input函数_字符串_str_容器_ 输入输出

    061_python如何接收输入_input函数_字符串_str_容器 输入输出0 播放 · 0 赞同视频 ​python如何接收输入_input函数_字符串_str_容器_ 输入输出 回忆上次内容...互动 input input 也是 内建的函数 可以 用这个input函数 输入字符 吗?...oeasy" 没赋给 任何变量里 就像 水 没 容器 接收 就 直接流走了 变量 需要 有变量名 作为 容器 接受 输入的字符串 name = input() 把输入的 字符串 赋给...help(input) input函数 从标准输入流(Standard In) 得到字符串 input函数括号里面 可以放 字符串参数prompt 作为 提示信息 这个词怎么这么眼熟?!...总结 这次讲的是 从键盘输入变量的值 input 函数 可以 接收到 输入字符串 存在 变量里 input函数的参数 叫prompt 在哪里见过呢? 我们下次再说!

    5010

    【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一、将 两头堵模型 抽象成业务模块函数 二、完整代码示例 一、将 两头堵模型 抽象成业务模块函数 ---- 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 ,...一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 int *count 是返回值 ; int get_count(char *str_all, int *count) 函数返回值 : 函数的返回值..., 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 形参指针判空 : 函数的第一项任务就是 判定 形参指针是否合法 , 如果任何一个指针为空 , 直接返回 -1 ;...== NULL || count == NULL"); return -1; } 形参返回值操作 : 函数的真正返回值 , 不要急着写入到指针指向的内存中 , 先放在局部变量中..."; // 要统计的结果 int count = 0; // 调用函数计算上述字符串 收尾不为空 的子串 int ret = get_count(str, &

    73220

    C语言经典100例003-统计一行字符串单词的个数,作为函数值返回

    喜欢的同学记得点赞、转发、收藏哦~ 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即时查收 1 题目 编写函数fun() 函数功能:统计一行字符串单词的个数,作为函数值返回一行字符串在主函数中输入...故判断一个空格的前一个是否为空格,如果不是,数量加1;如果是,不做处理 3 代码 #include #include #define M 3 #define N 4 /** 编写函数...fun() 函数功能:统计一行字符串单词的个数,作为函数值返回 一行字符串在主函数中输入,规定所有单词都是由小写字母组成,单词之间由若干空格隔开,一行的开始没有空格 **/ int fun(char...int main(int argc, char const *argv[]) { char s[] = "hello world i am c language"; printf("字符串内容.../demo 字符串内容:hello world i am c language 单词个数为:6 -- END -- 喜欢本文的同学记得点赞、转发、收藏~ 更多内容,欢迎大家关注我们的公众号:计算广告生态

    2.1K40

    来挑战下这 10 个 Python 问题

    >>> sum([ el.imag for el in [ 0, 5, 10e9, float('inf'), float('nan') ] ]) 8、输出负数倍的字符串...iterable 一般是数字,起始值不允许是字符串。 在上述所有情况下,空字符串都被视为空序列,因此 sum 将简单地将起始参数作为总结果返回。...这是因为 Python 中的所有数值类型(int、real、float)都继承自基对象类,它们都支持 real 和 imag 属性,分别返回实部和虚部。这也包括 Infinity 和 NaN。...8、输出负数倍的字符串 >>> "this is a very long string" * (-1) '' >>> 正确的结果是 '',所有的负数倍的字符串,都当作 0 倍,返回 ''。...max 的逻辑是,如果多个最大值,返回遇到的第一个。因此 max 函数返回第一次出现的零,它恰好是负数。

    49810

    【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】

    例如:virtual int getValue(); 表示返回值类型为 int 的虚函数。...纯虚函数与抽象类 一、纯虚函数的本质与语法规则 纯虚函数是一种特殊的虚函数,其语法形式为 virtual 返回值类型 函数名 (函数参数) = 0;。...这是因为 C++ 标准并没有严格规定 typeinfo::name() 函数返回的具体字符串格式,只是要求其返回结果一定包含类型名相关的信息。...strstr 函数的功能是在一个字符串中查找另一个子字符串首次出现的位置,如果找到了,就返回指向该子字符串在原字符串中起始位置的指针;如果没找到,则返回空指针。...函数返回值是一个指向主字符串中首次出现子字符串位置的指针,如果在主字符串中没有找到对应的子字符串,那么返回空指针 nullptr(在 C 语言中返回 NULL)。

    9410

    剖析多态的原理及实现

    虚函数的重写与覆盖 重写(Override)是指派生类对基类的虚函数提供新的实现。派生类中的虚函数必须和基类虚函数的签名完全相同,即**返回类型、函数名、参数列表**必须一致。...虚函数重写的其他问题 协变 当派生类重写基类的虚函数时,如果基类虚函数返回基类类型的指针或引用,派生类虚函数可以返回派生类类型的指针或引用。这种情况称为协变。...return 0; } C++11 中的 override 和 final 关键字 为了防止虚函数重写时出现意外情况,C++11引入了override和final关键字。...重载与返回值无关,返回值类型不能用于区分重载。...----+ | 只读数据段/常量区 | --> 存储常量字符串、只读数据(如虚表) +-------------------------+ | 全局数据区 |

    16510

    【C 语言】内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )

    字符串 内容 及 指针指向的地址 ; 代码示例 : #include /* * 函数1 返回字符串 1 */ char *get_str1() { char *p1...= "abc"; return p1; } /* * 函数2 返回字符串 2 */ char *get_str2() { char *p2 = "123"; return..., 字符串指针地址不同 ; p1=abc, p2=123 p1=4210756, p2=4210760 二、获取相同的字符串内容 ---- 如果在 2 个函数中 , 获取的 字符串 是相同的字符串...; 此时打印出两个函数的指针地址是相同的 , 这是因为 获取的 字符串 都是从 全局区 中的 常量区 中获取的 ; 代码示例 : #include /* * 函数1 返回字符串...1 */ char *get_str1() { char *p1 = "abc"; return p1; } /* * 函数2 返回字符串 2 */ char *get_str2

    3.7K10

    C++内存分区模型分析与实例以及扩展

    可执行程序,未执行该程序前分为两个区域 代码区: 存放 CPU 执行的机器指令 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令...cout 字符串常量地址为: " 字符串常量地址为: " 返回局部变量的地址,栈区开辟的数据由编译器自动释放,函数运行结束后函数内的局部变量被释放,将无法使用传回的函数体内的局部变量的地址...; 6,malloc 仅根据需要申请定量的内存空间; 1,对象的创建只能用 new,malloc 不适合面向对象开发;2,下面代码输出什么?...; 4,malloc 仅分配需要的内存空间; 5,对象的创建只能使用 new; 6,malloc 不适合面向对象开发;4,下面的代码输出什么?

    79841

    精选 30 个 C++ 面试题(含解析)

    允许在派生类中对基类的虚函数重新定义。 纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在的纯虚函数不具备函数的功能,一般不能直接被调用。...从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。 抽象类中不仅包括纯虚函数,也可包括虚函数。...注: 定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。...const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1)const 常量有数据类型,而宏常量没有数据类型。...cout输出 4(32位机器)/8(64位机器); return 0; } 因为有虚函数的类对象中都有一个虚函数表指针 __vptr,其大小是4字节

    2.3K30

    Go基础——数据类型

    Go 的 unsafe 包提供了一个 Sizeof 函数,该函数接收变量并返回它的字节大小。unsafe 包应该小心使用,因为使用 unsafe 包可能会带来可移植性问题。...complex128:实部和虚部都是 float64 类型的的复数。 内建函数 complex 用于创建一个包含实部和虚部的复数。...complex 函数的定义如下: func complex(r, i FloatType) ComplexType 该函数的参数分别是实部和虚部,并返回一个复数类型。...实部和虚部应该是相同类型,也就是 float32 或 float64。如果实部和虚部都是 float32 类型,则函数会返回一个 complex64 类型的复数。...如果实部和虚部都是 float64 类型,则函数会返回一个 complex128 类型的复数。 还可以使用简短语法来创建复数: c := 6 + 7i 下面我们编写一个简单的程序来理解复数。

    41510
    领券