C++基本概念总结——虚函数和非虚函数

c++虚函数详解 某基类中声明为virtual并在一个或多个派生类中重新定义的成员函数叫做虚函数。用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”。实现动态联编,在函数运行阶段动态的选择合适的成员函数。 在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。... 阅读详情

虚函数享有面向对象的“多态”性,考虑下面的例子:

class Base{
public:
	virtual void VirtualFunc(){ cout << "Base::VirtualFunc" << endl; }
	void Func(){ cout << "Base::Func" << endl; }
};

class Derived : public Base{
	virtual void VirtualFunc(){ cout << "Derived::VirtualFunc" << endl; }
	void Func(){ cout << "Derived::Func" << endl; }
};

int main()
{
	Base b;
	Derived d;

	Base* pb = &b;
	pb->VirtualFunc();
	pb->Func();

	pb = &d;
	pb->VirtualFunc();
	pb->Func();

	return 0;
}

pb为基类类型的指针,调用虚函数时,调用的是相应的派生类对象的虚函数。而调用非虚函数时,就只能调用基类对象的函数。以上代码输出为:

Base::VirtualFunc
Base::Func
Derived::VirtualFunc
Base::Func


从语义上说,虚函数属于类的“个性”;非虚函数属于类的“共性”。

既然是“个性”,就表示基类和派生类的行为是不同的,因此派生类需要重写基类的虚函数。

对于“共性”,说明派生类的行为和基类是一样的,因此该行为可以放到基类里,派生类和基类共同使用。

需要注意的是,重写非虚函数在语义上是行不通的,既然要重写,说明派生的行为和基类的不同,那就表明是“个性”而非“共性”。如果确实要重写非虚函数,建议将其改为虚函数,以增强语义。

OOP基本概念对比:RUST与CPP 面向对象,基本概念,关于对象创建、继承、多态的对比,C++与Rust在实现上的差异 阅读详情

相关推荐

继承中的虚函数与非虚函数

在看公司代码时, 发现了一处关于虚函数的我比较难以理解的地方,大致描述如下: 子类继承父类, 包括继承了虚函数和非虚函数 子类调用父类中的非虚函数 Base::PrintWord(), 在这个非虚函数里它又调用了虚函数doPrintWord()。 实验表明调用的虚函数执行的是重写的子类虚函数。 大致的代码可以简写为以下一个例子:#include <iostream>using

3129

虚函数、纯虚函数、非虚函数到底有啥区别?

虚函数,纯虚函数,非虚函数的区别;从覆盖和提供默认实现的角度类比区分其本质

weixin_53717695的博客 773

AI脸部替换Roop-Unleashed,一键整合包教程

Roop-Unleashed是一个无须训练模型的深度伪造工具,专为图像和视频的面部替换而设计。它通过简洁的浏览器界面提供用户友好且跨平台的使用体验,无论用户是业余爱好者还是专业人士,都能快速上手。它无需复杂的设置即可实现高效的处理和转换,使图像和视频的编辑变得更加轻松和便捷。

m0_72580657的博客 1万+

c++多态,虚函数和非虚函数,编译器在背后到底做了啥?

虚函数是一种动态绑定机制,在编译时编译器并不知道到底调用父类的虚函数还是子类的虚函数,这时候就会将虚函数的调用放在程序执行的时候,即动态绑定,运行时绑定,知道运行时才会调用子类的虚函数这就是多态的产生。 在类中编译器都会做出一个虚函数表,这个表的内容其实也是在编译是确定了,是静态的,而多态调用还会使用this关键字,稍后讨论。编译器做出表后还会给类中增加一个指向虚函数表的指针vfptr,vfptr...

qq_26954059的博客 414

STLink驱动故障全解析:从卡顿到重装的终极修复指南

本文全面解析STLink驱动故障的常见现象及解决方案,包括驱动卸载、重装、Keil环境配置等关键步骤。针对设备管理器黄色感叹号、Keil识别异常等问题,提供从软件到硬件的终极修复指南,帮助开发者高效解决STLink连接问题。

sss66的博客 734

Clion编译stm32cube初始化工程时non constant or forward reference address expression for section .ARM.extab报错

相信应该有同学在看了稚晖君关于clion开发stm32的文章之后也想在自己PC上实现“优雅の嵌入式开发”遇到和我类似的问题。他的文章是22年写的,我个人猜测应当是版本更新导致的不适配。意思就是说 READONLY 只能在gcc11以后的版本中使用,gcc10及以前的版本将无法正确识别,也就有如下错误。或者就可以将gcc升级至最新的版本。记得在clion工具链中修改c,cpp编译器的位置。可以将文本括号中的 READONLY 全部删除。当时由于没有注意到这行注释导致在这里卡了好久。

2301_77256849的博客 2510

虚函数、纯虚函数与非虚函数在继承方面的区别

虚函数;子类继承父类的接口与缺省实现,即子类可以自己定义实现,也可以直接用父类的缺省实现。 纯虚函数:子类只继承父类的接口。纯虚函数必须在子类中声明,但是它可以在父类中有自己的实现。子类可以通过作用域调用父类的纯虚函数的实现代码。 非虚函数:子类继承父类接口与强制实现。尽量不要在子类中重新实现非虚函数,因为既然继承过来,证明这些是必要的,如果在子类中重新实现,那继承就多此一举。

qq_37185716的博客 977

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9204

C++中虚函数和普通函数的区别

虚函数跟普通函数的区别就是当基类指针或引用指向派生类对象时,通过指针或引用调用成员函数,对于非虚函数,调用的是静态类型(指针/引用类型)的版本,对于虚函数,在运行时动态绑定,调用的是实际类型的版本。。例子你可以看一下输出的前两行。

focus leepple 2236

基于51单片机的电压表【0-20V,ADC0832,4051,自动量程】(仿真)

自动换挡式数字电压表就是一个基于单片机的能自动切换量程的数字电压表,其作用是在使用低位的AD转换实现高精度电压测量,可以测量0~20V的电压,并且具有0~0.2V(待测电玉低于0.2V时),0~2V(待测电压低于2V时)和0~20V三个量程自动匹配测量,当待测电压值发生变化时,电压表可以根据输入电压情况自动选择合适的量程进行测量,并且把测量结果显示出来。(2)实现电压表精度测试,最高精度要求0.01V;(1)实现0~20V分3档式电压表;

qq_63964231的博客 1497

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 371

子类(虚函数,非虚函数)重写父类的函数(虚函数,非虚函数)等4种情况下的输出

1.子类重写父类“虚函数”,子类也写“虚函数” #include<iostream> using namespace std; class parent{ public: virtual void s(){ cout<<"parent"<<endl; } }; class son : public parent{ public: virtual voi...

qq_43625764的博客 7870

Matlab信号处理——基于BP神经网络的调制信号分类与识别

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!对信号进行采样和处理,得到了一系列特征参数,包括幅度均值、频率峰值、频率平方均值以及相位标准差、修正后的相位标准差。

小嘤熊的博客 1308

C++的虚函数理解例子

/****************************************************************************************************** * File:PolymorphismTest * Introduction:测试多态的一些特性。 * Author:CoderCong * Date:20141114 * Last...

刘小雨的博客 286

cilium native-routing模式流程分析

本文分析cilium native routing模式下的报文路径和涉及到的ebpf源码分析。实验环境在vxlan模式下修改参数后而来。native routing和vxlan模式的区别主要是跨节点通信时,vxlan模式需要封装,native routing模式需要根据目的ip查找路由表转发到其他节点。

fengcai_ke的博客 988

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++——多态与虚函数的理解

一、问题 多态的作用? 当父类指针指向子类对象时,会根据虚函数表调用子类的虚函数 重写的作用? 当父类指针指向子类对象时,由于指针类型为父类,调用的依旧是父类的非虚函数 当子类指针指向子类对象时,由于指针类型为子类,调用的是子类的非虚函数 二、代码验证 class Base { public: Base() { } void function() { cout << "base: not virtual" << endl; }

Dedication_的博客 249

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++基类和子类指针调用函数关系(非虚函数和虚函数)

第一种情况,当基类和子类中声明的是同名非虚函数时.调用关系如下 #include <iostream> using namespace std; #include <bits/stdc++.h> class AAA { public: void test1() { printf("This is AAA: test1()\n"); test2(); } void test2(){ printf(...

gyc0830的博客 8110

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用类的空指针调用非虚成员函数和虚函数

        先来看下面这段代码: class A { private: int data; public: void fun1() { } virtual void fun2(){ } }; int main() { A *p = nullptr; p->fun1(); p->fun2(); }         p是空指针,fun1()是普通成员函数,fun2(

WYuan的博客 2411

C++ 纯虚函数 虚函数 override

override在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。 1.公有继承 包含两部分:一是“接口”(interface),二是 “实现” (implementation)。 class Shape { public: virtual void Draw() const = 0;

软件工程小施同学 的专栏 3893

C++中虚函数和纯虚函数的问题总结

目录 C++中虚函数和纯虚函数的问题总结 虚函数 虚函数的定义 虚函数的目的 纯虚函数 纯虚函数的定义 纯虚函数的特点 虚函数相关问题 问题一:基类的虚函数表存放在内存的什么位置,虚表指针vptr的初始化时间 问题二:虚函数能否声明为内联函数? 问题三:构造函数为什么不能为虚函数?析构函数为什么要虚函数? 问题四:构造函数和析构函数可以调用虚函数吗? 问题五:静态成员函数static能定义为虚函数吗?常成员函数const呢? 问题六:哪些函数不能是虚函数? C++.

weixin_44477424的博客 2041

面试题目(3)——虚函数和非虚函数的调用

本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                                考查虚函数和非虚函数的调用                                                

学习,思考,记录,分享。 4305

C++虚函数表和虚函数调用机制、同名非虚函数调用机制

#include using namespace std; class Base{ public: virtual void f(int a){ cout << "Base::f(int )" << endl; } virtual void g(){ cout << "Base::g()" << endl; } virtual void h(){ cout << "Base::h()"

gukesdo的专栏 4134

C++中当对象指针为空时,虚函数和非虚函数的调用情况

当我们定义一个类的对象为空时,这时我们调用该对象中的函数,我们会发现当调用非虚函数时仍可以正常调用,而如果要调用虚函数则会报错。如下示例: class Progress { public: void print(int L) { cout << "L = " << L << endl; } }; int main() { Progress *a = NULL; a->prin

Brady的专栏 3495

cpp_11_虚函数_多态_纯虚函数

虚函数(虚方法) 虚函数的主要应用(动态多态) 纯虚函数

wwwwood的博客 1267

类继承设计中:纯虚函数,非纯虚函数、非虚函数如何选择。

1、纯虚函数(pure virtual function): 声明一个pure virtual函数的目的是为了让derived classes只继承函数接口,派生类必须提供实现。 可以为pure virtual函数提供定义,但使用时需要指明所属类,如: //.h class A{ public: virtual void func1() = 0; }; class B : public A{ p...

个人工作中学到的专业技术与职业发展知识笔记 876

C++虚函数

虚表指针是一个特殊的指针,存在于每个包含虚函数的类的对象中。它通常存储在对象的内存布局的起始位置,用于指向该对象所属类的虚函数表(vtable)。这个指针的主要作用是实现C++的动态绑定(也称为动态多态或运行时多态)。纯虚函数是在基类中声明的一种特殊的虚函数,它在基类中没有实现,只有函数声明,使用=0来标记。在当类中有了纯虚函数这个类也称为抽象类。

2301_78992766的博客 1069
上一篇: C++基本概念总结——静态成员
下一篇: C++基本概念总结——构造函数的public/protected/private语义
林 文
博客等级 码龄18年 14粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值