C++ 虚函数,纯虚函数的作用和使用方法

基类与派生类中有同名函数。在下面的程序中Student是基类,Graduate是派生类,它们都有display这个同名的函数。

#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<<"\n\n";
}
//声明公用派生类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,1200);//定义Graduate类对象grad1
	Student *pt=&stud1;//定义指向基类对象的指针变量pt
	pt->display( );
	pt=&grad1;
	pt->display( );
	return 0;
}

运行结果如下:

num:1001(stud1的数据)
name:Li
score:87.5

num:2001 (grad1中基类部分的数据)
name:wang
score:98.5

虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

下面对程序作一点修改,在Student类中声明display函数时,在最左面加一个关键字virtual,即
virtual void display( );
这样就把Student类的display函数声明为虚函数。程序其他部分都不改动。

结果:
num:1001(stud1的数据)
name:Li
score:87.5

num:2001 (grad1中基类部分的数据)
name:wang
score:98.5
pay=1200 (这一项以前是没有的)

虚函数实现了可以通过基类指针或引用来访问基类和派生类中的同名函数。

C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加

注意:在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

访问控制

派生类的成员可以直接访问基类的保护成员(Protected),但不能直接访问基类的私有成员(Private)。

纯虚函数:

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0",例如:

virtual void func() =0

声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值