C/C++ 虚函数与多态(含vector用法) 及获取文件内容、打印字符串实例

本文深入探讨了C++中的虚函数概念及其在实现运行时多态中的应用,通过具体实验代码,展示了如何利用虚函数与类指针实现不同功能,包括文件读取、字符串处理、大小写转换等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

before|正文之前:

c++实验代码及学习笔记(十)

你好! 这是一个高程实验课的代码记录及学习笔记。我将记录一些重要的知识点、易错点。但是作为大学生,水平很低,敬请指点教导、优化代码。

1问题

实验
题目比较难懂,首先我们从实验目的得知,主要运用虚函数与运行时多态的知识。
我们需要实现的是从文件读取字符串,且一个函数(调用不同类指针)可以实现不同功能。
第一,我们已经从以前的实验中习得,如何获取文件。之前我们使用的c语言的函数,此次我们将自学c++输入流的方法。
第二,这个函数比较难以理解,一开始我以为是抽象类虚函数、派生类不同的readstrings函数,但是这样无法使用类指针。故这个函数在全局范围内使用。题目解释
第三,我们来看不同的功能:打印很好实现,而获取包含字符数最多的字符串较难;大小写转换通过查阅博客可以学习,比较简单。获取字符数最多的字符串可以理解为,以空格为分隔,比较不同长度的字符子串。如何分割空格、比较,就成为了本次的难题。
第四,最后一小题需要存储vector,我们将自学vector并进行讲解。

2精讲

2.1初识虚函数

参考文章:
1 c++虚函数详解(你肯定懂了)
2 理解C++虚函数

C++虚函数是定义在基类中的函数,子类必须对其进行覆盖。在类中声明(无函数体的形式叫做声明)虚函数的格式如下:

virtual void display();

为什么要用虚函数?

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

我们来看看简单的例子。
(1)定义子类对象,并调用对象中未被子类覆盖的基类函数A。同时在该函数A中,又调用了已被子类覆盖的基类函数B。那此时将会调用基类中的函数B,可我们本应该调用的是子类中的覆盖函数B。虚函数即能解决这个问题。
虚函数1
在这里插入图片描述
(2)在使用指向子类对象的基类指针,并调用子类中的覆盖函数时,如果该函数不是虚函数,那么将调用基类中的该函数;如果该函数是虚函数,则会调用子类中的该函数。
虚函数3
修改为虚函数则能解决这个问题。
这就是虚函数最简单的理解,具体原理不作讲解,参考文章。

2.2类成员指针

参考文章
1 【C++面向对象】C++的类型成员指针
2 如何使用指向类的成员函数的指针(详解!)

  1. 是什么?
    类型成员指针不是指针成员

类型成员指针可以指向本类任意一个对象的该成员,并可以对成员进行读写操作。请注意这里是说的任意一个对象,也就是说类型成员指针和类对象无关。

  1. 是指针吗?
    类型成员指针不是指针

类型指针是对象成员相对于对象地址的偏移量
当我们用类对象去调用该类型成员指针时,程序就会用类对象地址加上改偏移量去解析其对应的值。

  1. 如何使用类成员函数指针
    1定义类成员函数指针时指针前面必须加类名和命名空间限定符,也就是形如:person::*p;同时等号右边、类成员函数前面必须加上取地址操作符&。
    2使用类成员函数指针时必须把对象名和指针名括起来,形如:(p1.*p)
class person
{
   
	public:
		std::string m_name;
		person(const char* name):m_name(name){
   }
		void print();
};
int main()
 {
   
 		void (person::*p)()=&person::print;
 		person p1("张三",28);
 		(p1.*p)();
 }

成员指针的调用:
成员函数指针的调用必须通过类对象,和操作符 .* 或 ->*

int person:: * pi = &A::i;
Person a;
a.*pi;      // 等同于 a.i
person* a_ptr;
a_ptr->*pi; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值