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。虚函数即能解决这个问题。
(2)在使用指向子类对象的基类指针,并调用子类中的覆盖函数时,如果该函数不是虚函数,那么将调用基类中的该函数;如果该函数是虚函数,则会调用子类中的该函数。
修改为虚函数则能解决这个问题。
这就是虚函数最简单的理解,具体原理不作讲解,参考文章。
2.2类成员指针
参考文章
1 【C++面向对象】C++的类型成员指针
2 如何使用指向类的成员函数的指针(详解!)
- 是什么?
类型成员指针不是指针成员
类型成员指针可以指向本类任意一个对象的该成员,并可以对成员进行读写操作。请注意这里是说的任意一个对象,也就是说类型成员指针和类对象无关。
- 是指针吗?
类型成员指针不是指针
类型指针是对象成员相对于对象地址的偏移量!
当我们用类对象去调用该类型成员指针时,程序就会用类对象地址加上改偏移量去解析其对应的值。
- 如何使用类成员函数指针
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;