首页
学习
活动
专区
工具
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.4K2118

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

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

    92310

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

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

    7.2K30

    【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, &

    71220

    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 函数返回第一次出现的零,它恰好是负数。

    49010

    剖析多态的原理及实现

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

    1200

    【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 << "字符串常量地址为: " << (int)&"hello world" << endl; cout << "字符串常量地址为: " << (int)&"hello world1...;​ system("pause");​ return 0;}易错点不要返回局部变量的地址,栈区开辟的数据由编译器自动释放,函数运行结束后函数内的局部变量被释放,将无法使用传回的函数体内的局部变量的地址...; 6,malloc 仅根据需要申请定量的内存空间; 1,对象的创建只能用 new,malloc 不适合面向对象开发;2,下面代码输出什么?...; 4,malloc 仅分配需要的内存空间; 5,对象的创建只能使用 new; 6,malloc 不适合面向对象开发;4,下面的代码输出什么?

    78141

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

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

    1.1K30

    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 下面我们编写一个简单的程序来理解复数。

    40510

    C++查缺补漏

    ,将使用实参对象初始化形参对象,发生复制构造 如果函数返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造 隐含的复制构造函数...、参数个数及对应参数类型 该函数是否与基类的函数有相同的返回值或者满足类型兼容规则的指针、引用型的返回值 如果从名称、参数及返回值三个方面检查之后,派生类的函数满足上述条件,就会自动确定为函数。...( ostringstream ) 将字符串作为输出流的目标,可以实现将其他数据类型转换为字符串的功能 //用ostringstream将数值转换为字符串 #include #include...v; //将变量v的值写入字符串流 return os.str(); //返回输出流生成的字符串 } int main() { string str1 = toString...对象 一个fstream对象是有两个逻辑子流的单个流,两个子流一个用于输入,另一个用于输出 stringstream类 stringstream类支持面向字符串的输入和输出 可以用于对同一个字符串的内容交替读写

    2.5K10
    领券