c++基础:12.虚函数

虚函数引入一种要动态分配的东西,一般通过虚表(vtable)实现编译。虚表就是一个包含类中所有虚函数映射的列表,通过虚表可以在运行时找到正确的被重写的函数。

//demo.cpp
#include<string>
#include <iostream>
class People
{
	public:
	void GetName()
	{
		std::cout<<"people"<<std::endl;
	}
};
class Student:public People
{
	public:
	void GetName()
	{
		std::cout<<"student"<<std::endl;
	}
};

int main()
{
	People p;
	p.GetName();
	Student s;
	s.GetName();
	People *point = new Student();
	point->GetName();	
}
//打印结果
people
student
people

为什么一个指向派生类的指针调用的是基类的函数呢?
因为在类中正常声明的函数或方法,当调用这个方法的时候,总会去调用属于这个类型的方法。
使用虚函数

//demo.cpp
#include<string>
#include <iostream>
class People
{
	public:
	virtual void GetName()
	{
		std::cout<<"people"<<std::endl;
	}
};
class Student:public People
{
	public:
	void GetName()override
	{
		std::cout<<"student"<<std::endl;
	}
};

int main()
{
	People p;
	p.GetName();
	Student s;
	s.GetName();
	People *point = new Student();
	point->GetName();	
}
//打印结果
people
student
student

virtual 和 override 关键字
基类中想要声明为虚函数的,要在前面加vitual,派生类中,重写的虚函数要在函数后加override关键字,override可以省略,建议添加有助于阅读。

c++接口 特殊的虚函数–纯虚函数

纯虚函数允许在基类中定义一个没有实现的函数,强制在基类中进行实现。

//demo.cpp
#include<string>
#include <iostream>
class People
{
	public:
	virtual void GetName()=0;//纯虚函数
};
class Student:public People
{
	public:
	void GetName()override
	{
		std::cout<<"student"<<std::endl;
	}
};

int main()
{
	//People p;
	//p.GetName();
	Student s;
	s.GetName();
	People *point = new Student();
	point->GetName();	
}
//打印结果
student
student

People类只有一个纯虚函数,可以将People类称为接口类,接口类不能实例化对象。派生类Student必须实现基类中的纯虚函数,否则也不能实例化对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值