我是靠谱客的博主 热心母鸡,最近开发中收集的这篇文章主要介绍C++虚函数介绍和使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于C++的虚函数介绍和使用,这篇博文写得特别好:
http://c.biancheng.net/cpp/biancheng/view/244.html

归纳一下,虚函数是在以下场景中使用的:

定义了某个基类,有大量多层次的子类继承自该基类,子类的成员函数和基类的成员函数同名。每次想调用子类里面这个成员函数时会很麻烦,必须用成员访问符“.”来访问才不会乱。用指针是个好想法,但实际上并不可行。

参考以下代码:

#include <iostream>
#include <string>

using namespace std;

//声明基类Student
class Student
{
public:
	Student(int, string, float);  //声明构造函数
	void display();//声明输出函数
protected:  //受保护成员,派生类可以访问
	int num;
	string name;
	float score;
};

//Student类成员函数的实现
Student::Student(int n, string nam, float s)//定义构造函数
{
	num = n;
	name = nam;
	score = s;
}

void Student::display()//定义输出函数
{
	cout << "num:" << num << "nname:" << name << "nscore:" << score << "nn";
}

//声明公用派生类Graduate
class Graduate :public Student
{
public:
	Graduate(int, string, float, float);//声明构造函数
	void display();//声明输出函数
private:float pay;
};

// Graduate类成员函数的实现
void Graduate::display()//定义输出函数
{
	cout << "num:" << num << "nname:" << name << "nscore:" << score << "npay=" << pay << endl;
}
Graduate::Graduate(int n, string nam, float s, float p) :Student(n, nam, s), pay(p) {}

//主函数
int main()
{
	Student stud1(1001, "Li", 87.5);//定义Student类对象stud1
	Graduate grad1(2001, "Wang", 98.5, 563.5);//定义Graduate类对象grad1
	Student *pt = &stud1;//定义指向基类对象的指针变量pt
	pt->display();
	pt = &grad1;
	pt->display();

	system("pause");
}

输出结果:

num:1001
name:Li
score:87.5
num:2001
name:wang
score:98.5

前三行是第一个学生的数据,后三行是第二个研究生的数据。

程序的本意是输出第一个学生的数据,再输出第二个研究生的数据(除号码、名字、分数外,还多一个支付费用),可是研究生的支付费用没有输出。

问题就出在同名的成员函数“display()”上。具体如下:

程序主函数的后面定义了一个指针指向基类。注意,这里就确定了该指针的类型为基类类型(Student)

Student *pt = &stud1;//定义指向基类对象的指针变量pt

下面用“->”访问基类的成员函数“display()”。

pt->display();

到此为止没有问题,学生1的数据正常输出。
接下来是问题所在。

pt = &grad1;
pt->display();

把研究生1的地址传到了指针上,但这里指针首先要进行类型转换——它先确定了自己是什么类型,再指向研究生1这个子类。

也就是说,它先确定了自己是“Student”即基类类型的指针,它所指向的,其实是子类中继承自基类的部分,而不是子类新定义的部分。那么下面再访问“display”,访问的其实还是基类里面的“display”成员函数,而不是子类自己定义的。所以依然输出了前三项数据。

为了解决这种成员函数同名问题,引入了“虚函数”。在这段代码中,在基类Student刚声明成员函数“display()”的前面加个“Virtual”即可,程序其它部分不用动。

virtual void display();//声明输出函数

重新编译运行,发现研究生的数据多了一项,输出了想要的数据。

虚函数的使用方法是:

  1. 在基类用virtual声明成员函数为虚函数。
    这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。
  2. 在类外定义虚函数时,不必再加virtual。在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
    C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
  3. 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
  4. 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。

基类使用虚函数后,继承子类的同名成员函数也会变成虚函数,并且在指针访问时,子类新的虚函数会取代旧的。因此,修改后的程序里,指针正确地指向了子类里定义的“display()”,得到了想要的结果。

最后

以上就是热心母鸡为你收集整理的C++虚函数介绍和使用的全部内容,希望文章能够帮你解决C++虚函数介绍和使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部