C++ 多态虚函数常见问题
哪些函数不能为虚函数?
- 非类成员的普通函数
- 静态(static)函数
- 构造函数不能是虚函数
- (存储角度)虚函数的vtable,是存储在对象的内存空间的。对象没有实例化,意味着内存空间还没有,所以无法找到对应的vtable;
- (调用角度)虚函数的作用在于父类的指针或者引用,根据动态类型调用(指向)子类的成员函数。构造函数本身需要初始化实例,所以不可能通过父类指针或引用来调用,所以不可能为虚函数,即使是虚函数也没有实际意。
- 友元函数,友元函数不属于类的成员函数,不能被继承。
内联函数是否可以为虚函数(虚函数可以是内联函数)?
- 虚函数可以是内联函数;
- inline是可以修饰虚函数;
- 编译器具有实际对象非指针或引用时可以内敛,但此时虚函数没有表现出多态性
参考:
虚函数可以是内联函数吗?
析构函数是否可以为虚函数?
可以
虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。
#include <iostream>
#include <memory>
using namespace std;
class SoftWare {public:SoftWare(){};virtual ~SoftWare() { std::cout << __FUNCTION__ << std::endl; };//运行期多态virtual void RunApp() { std::cout << " Interface SoftWare " << std::endl; };
};class ChatApp : public SoftWare {public:ChatApp(){};~ChatApp() { std::cout << __FUNCTION__ << std::endl; };void RunApp() { std::cout << " Start Chat APP " << std::endl; }
};int main()
{SoftWare* app = new ChatApp();std::cout << "================================" << std::endl;app->RunApp();delete app;app = nullptr;/*由于SoftWare有虚析构函数,delete释放内存会先调用派生类析构函数,再调用基类析构函数,防止内存泄漏。*/ std::cout << "================================" << std::endl;return 0;
}
虚析构函数存在的原因:
- delete释放基类指针时,编译器会根据类型来调用类的成员函数,首先调用基类的析构函数,如果有派生类,则会根据虚表继续调用派生类的析构函数。
- 假设基类的析构函数为非虚函数时,当释放一个基类指针指向的派生类实例时,则只清理了派生类从基类继承过来的虚函数,而派生类自己独有的资源却没有被清理。
为什么默认的析构函数不是虚函数?
节省内存
类中有虚成员函数时,类会自动进行执行一些工作。包括生成虚函数表和虚表指针,这样会占用额外的内存,如果类无派生类,这种内存开销无疑是浪费;
什么是纯虚函数?
纯虚函数是在基类中声明的虚函数,它在基类中有定义,在派生类必须定义自己的实现方法。基类不能创建对象,可以使用指针或者引用派生类对象。语法上基类声明纯虚函数的方法,是在函数原型后加“=0”
virtual int TestFunc() = 0;
- 含有纯虚函数的类叫抽象类,抽象类不能直接创建对象。只有被继承并重写其纯虚函数后,才能使用。
- 抽象类被继承后,子类可以继续是抽象类,也可以是普通类
纯虚函数存在的原因及意义?
- 为了使用多态特性,需要在基类中定义虚拟函数,很多时候,基类本身生成对象是不合情理的。从面向接口编程出发,接口可以被实例化,这违背了“接口”本身的意义。
- 纯虚函数存在:让所有继承抽象类的派生类都可以执行纯虚函数的动作,但抽象类不会为纯虚函数提供一个默认方法。强行让派生类实现属于自己的虚函数方法。
C++ 多态虚函数常见问题相关推荐
- 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )
文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...
- C++ 多态 虚函数与纯虚函数
C++ 多态 虚函数与纯虚函数 虚函数是C++重要思想-多态中不可或缺的一个知识点与用法,但初学者一般很难理解,在这里用通俗语言介绍一下. 百度百科: 在某基类中声明为 virtual 并在一个或多个 ...
- 【C++ Priemr | 15】虚函数常见问题
1. 在成员函数中调用虚函数: #include <iostream> using namespace std; class CBase { public:void func1(){fun ...
- C++多态虚函数/纯虚函数demo
#include <iostream> using namespace std;class A //A是一个抽象类,不能new A直接实例化. { public:virtual void ...
- C++多态虚函数demo
#include<iostream> #include<algorithm> using namespace std;class Base{ public:void Fun(i ...
- 【C++】多态 - 虚函数/虚析构函数以及虚函数表
什么是多态: 指不同对象收到相同消息时或相同对象收到不同消息时产生不同的动作. 这里先说下为什么会用到虚函数: 以下面的程序为例: 这个程序中,Carp是Fish的继承类,而Carp中覆盖了Swim这 ...
- C++——多态|虚函数|重写|虚表
文章目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1多态的构成条件 2.2 虚函数 2.3虚函数的重写 虚函数重写的三个例外: 2.4 普通调用和多态调用: 2.5 C++11 o ...
- c语言支持虚函数,C语言多态虚函数.doc
中类的多态与虚函数的使用 出处:PConline 2005年03月16日 作者:管宁 责任编辑:xietaoming 文章导读:类的多态特性是支持面向对象的语言最主要的特性,很多人错误的认为,支持类的 ...
- c++基础学习(08)--(继承、重载、多态、虚函数)
文章目录 目录 1.继承 2.重载 3.多态 && 虚函数 目录 1.继承 #include <iostream>using namespace std;// 基类 cla ...
最新文章
- OpenCV中基于LBP算法的人脸检测测试代码
- SharpSvn使用说明
- Tomcat中的Session小结
- LeetCode 1:Two Sum
- ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath
- 如何采用设置标志的方法来区分循环队列的满和空
- LeetCode 739. 每日温度(单调栈)
- 编译用于高放射性环境的应用程序
- Linux svn服务器搭建
- 修改msde登录方式,设置sa密码为空
- Py西游攻关之面向对象(二)
- 发字的楷书写法图片_硬笔书法笔顺正确写法,手写示范动态图
- Alien Skin Exposure v6.x 最新通用完整版汉化补丁
- Python爬虫英语四六级网站查询准考证号
- 腾讯会议怎么录屏?几个步骤轻松录屏
- 前端点击图片将跳出显示框显示图片
- 推荐收藏 | 掌握这些步骤,机器学习模型问题药到病除
- 计算机 软件工程 应不应该考研?(二)
- 市场调研报告-全球与中国AI加速器的渗透和路线市场现状及未来发展趋势
- RS232接口EMC设计方案