首页 > 其他分享 >什么是虚函数

什么是虚函数

时间:2022-12-01 19:23:49浏览次数:55  
标签:定义 什么 派生类 多态 virtual 基类 函数

虚函数是指:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,即被virtual关键字修饰的成员函数;格式为“virtual 函数返回类型 函数名(参数表) {函数体}”。
在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:;实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。

首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义它为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

class Animal
{
public:
	//Speak函数就是虚函数
	//函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}
};

class Cat :public Animal
{
public:
	void speak()
	{
		cout << "小猫在说话" << endl;
	}
};

int main() {
	Animal* a = new Cat(); //
	a->speak();//小猫在说话
	Animal b = Cat();
	b.speak();//动物在说话,不明白这里为什么没有发生多态
	system("pause");
	return 0;
}

这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。
from:https://www.php.cn/csharp-article-418074.html

关于b为什么没有发生多态?目前还没解决,猜测是因为没有满足这个,但是代码改成Animal& b = Cat();会报错:非常量引用的初始值必须为左值。 搜索后发现不是特别理解

标签:定义,什么,派生类,多态,virtual,基类,函数
From: https://www.cnblogs.com/swx123/p/16942425.html

相关文章

  • 一文轻松了解网络通信之镜像,端口镜像是什么
    本节内容主要对端口镜像(PortMirroring)认识,接下来的章节会对二层通信知识点进行系统讲解。端口镜像(PortMirroring)含义:指将指定的源端口某些报文,镜像到指定的镜......
  • vue生命周期及钩子函数
    1.什么是vue生命周期vue生命周期指实例从开始创建到销毁的过程,在整个生命周期中,它提供了一系列事件,可以让我们在事件触发时注册js方法。在这些方法中,this指向的......
  • GitHub上的三个不同的压缩包都有什么关系
     第一个是release版本,里面包含了源码,和Demo代码,比较大。后两个是源码,不含Demo。后面两个压缩方式格式不同,.zip格式用于windowstar.gz格式多用于Unix/linuxMacOS系统......
  • 什么是Nacos?
    Nacos是DynamicNamingandConfigurationService的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助您发现、配置和管理微......
  • 什么是Mbps、Kbps、bps、KB、MB及其换算和区别
    Mbps即Milionbitprosecond(百万位每秒);Kbps即Kilobitprosecond(千位每秒);bps即bitprosecond(位每秒);速度单位,bit即比特,通常用b(小写)表示,指一位二进制位,M......
  • Oracle开窗函数rank() over(partition by ... order by ... desc)
    原文地址:https://www.cnblogs.com/LoveShare/p/16408656.html1.创建表 --CreatetablecreatetableTEST(IDNUMBER(10)notnull,NAMEVARCHAR2(50),......
  • 缩短箭头函数的技巧
    https://dmitripavlutin.com/JavaScript-arrow-functions-shortening-recipes/使用箭头语法,你可以定义比函数表达式短的函数。在某些情况下,你可以完全省略:参数括号 (param1......
  • ASEMI-KBL410是什么元器件,kbl410整流桥参数
    编辑-Z俗话说,时势造英雄,整流桥大军中有一款整流桥KBL410有哪些你所不知道的?KBL410是什么元器件?kbl410整流桥参数是多少?  KBL410参数描述型号:KBL410封装:KBL-4电性......
  • 元宇宙未来的趋势究竟是什么?我们该如何把握?
                  作为支持本文的一个前提,第一个“真正”版本的元宇宙应该会在未来五年内开始实现。但起初,该版本的元宇宙只会带来视觉和听觉体验(可能会带有一些......
  • 2022开年最热投资赛道竟是虚拟人,背后隐藏了什么商业价值?
    METAVERSE背景在刚刚结束不久的2021年江苏卫视跨年演唱会上,虚拟邓丽君与歌手周深同台联唱,实现了跨时代合作,而这还不只是“邓丽君”,哔哩哔哩、东方卫视等多家跨年晚会都出现......