c++虚函数的使用方法

虚函数的使用方法:

 


(1)在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用。
在类外定义虚函数时,不必在定义virtual

 

 

 (2)在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数和类型全部与基类的虚函数相同,并根据派

 

生类的需要重新定义函数体。

c++规定,当一个成员函数被声明为虚函数后,其派生类的同名函数都自动成为虚函数。因此在派生类重新声明该

虚函数时,可以加virtual,也可以不加,但习惯上一般在每层声明该函数时都加上virtual,使程序更加清晰。

 

如果再派生类中没有对基类的虚函数重新定义,则派生类简单的继承起基类的虚函数。 

 

 (3)定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

 (4)通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。

 

下面来看一个例子:

#include<iostream>
#include<string>

using namespace std;

class Student
{
	public:
		Student(int , string, float);
		void display();
	protected:
		int num;
		string name;
		float score;	
};
Student::Student(int n, string na, float s)
{
	num=n;
	name=na;
	score=s;
}
void Student::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<endl;
}
class Graduate:public Student
{
	public:
			Graduate(int , string , float, float);
			void display();

	private:
			float pay;
	
};
Graduate::Graduate(int n, string na, float s, float p):Student(n,na,s),pay(p)
{
}
void Graduate::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay:"<<pay<<endl;
 }
 
int main()
{
	Student stud1(110,"SDL",99.8);
	Graduate grad1(120,"CCT",88.9, 250.5);
	
	Student *p;
	
	p=&stud1;
	cout<<"student:"<<endl;
	p->display();
	p=&grad1;
	cout<<"graduate:"<<endl;
	p->display();
	
	return 0;
} 

输出的结果为:

 

此时没有将任何函数声明为虚函数,所以在Graduate类中diaplay()函数输出时没有pay的值,以为p指针是Student类的,本身Student不包括pay数据。

但如果我们想输出pay的值,只要把Student类中的display函数声明为虚函数即可,只要把它改为virtual void display()声明为虚函数就行,输出的结果为:

  • 39
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
C++虚函数是为了实现动态联编,允许在程序的运行阶段动态地选择合适的成员函数。在基类声明虚函数,派生类可以对虚函数进行重新定义。重新定义的函数应该具有相同的形参个数和形参类型,以实现统一的接口。如果派生类没有重新定义虚函数,则继承基类的虚函数。 纯虚函数是在基类不能对虚函数给出有意义的实现时,将其声明为纯虚函数,并留给派生类去实现。纯虚函数的声明格式为:virtual <类型> <函数名>(<参数表>) = 0。纯虚函数没有函数体,派生类必须实现纯虚函数。 为了确保每个子类的虚函数都被实现,可以在父类声明一个含参数的纯虚函数。如果忘记在派生类实现纯虚函数,编译器会发出警告。例如: ```cpp class Person { public: virtual void sayLocation(const string& location) = 0; }; class Student : public Person { public: void sayLocation(const string& location) { cout << "I am a student in " << location << endl; } }; class Teacher : public Person { public: void sayLocation(const string& location) { cout << "I am a teacher in " << location << endl; } }; ``` 在这个例子,Person类声明了一个纯虚函数`sayLocation`,派生类Student和Teacher必须实现这个函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [38.【C++ 虚函数虚函数 虚基类 (最全详解)】](https://blog.csdn.net/qq_69683957/article/details/126397761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++虚函数与纯虚函数使用详解](https://blog.csdn.net/weixin_42108411/article/details/108013807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值