IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++面试】虚函数和纯虚函数 -> 正文阅读

[C++知识库]【C++面试】虚函数和纯虚函数

小米二面

在牛客网上的C++面筋题。

1. 虚函数和纯虚函数的区别

  • 因为写代码时不能在一开始就确定被调用的是基类的函数,还是哪个派生类的成员函数,所以C++通过虚函数实现多态,即在基类中用virtual声明,父类可以引用子类对象,子类成员函数可以重写父类方法(函数)。虚函数的核心理念就是通过基类访问派生类定义的函数。
    • 析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
    • 定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。

在这里插入图片描述

  • 定义一个函数为纯虚函数,才代表函数没有被实现。纯虚函数没有函数体,同时在基类声明时需要在函数原型后加上=0。如上所示:
    • 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。所以出现【抽象类】(含有纯虚函数的类)就规定不能实例化为对象。
    • 纯虚函数是为了安全,因为避免任何需要明确但是因为不小心而导致的未知的结果,提醒子类去做应做的实现。

【纯虚函数的实现原理】
纯虚函数也一定是某个类的成员函数,含有纯虚函数的类叫做抽象类。在C++中,抽象类无法实例化对象。如果我们定义了Shape这样的类,那么,Shape类当中,因为有虚函数和纯虚函数,所以它一定有一个虚函数表,也就一定有一个虚函数表指针。在虚函数表当中,如果是纯虚函数,那么虚函数表中的函数指针值为0;如果是普通的虚函数,那就肯定是一个有意义的值。
在这里插入图片描述
一个虚函数的最简单的栗子:

#include <iostream>
using namespace std;

class A{
public:
    virtual void foo()
    {
        cout<<"A::foo() is called"<<endl;
    }
};
class B:public A
{
public:
    void foo()
    {
        cout<<"B::foo() is called"<<endl;
    }
};
int main(void)
{
    A *a = new B();
    a->foo();   // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
	system("pause");
    return 0;
}

在这里插入图片描述

2. 构造函数能不能是虚函数

不能。。C++在编译期间,就能确定你要创建的对象的具体类型,而这个具体类型包含了什么,继承了什么在编译期间也是明确的,即构建一个对象,必须知道具体的类型信息,构造什么也都是明确的,根本没必要存在虚构造函数。虚函数的存在是因为编译期间没法确定具体调用对象,才会有虚函数,虚函数表这么个东西。

解决方案:Bjarne建议用factory pattern,也就是为每一个要构建的类型再创建一个对应的factory,把问题放到factory的make方法中去解决。这也是C++中的通用解决方案。

Reference

[1] https://www.zhihu.com/question/35632207

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:30:34  更:2022-02-09 20:33:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:30:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码