【为什么】什么是纯虚函数?C++之父谈

简介: 【为什么】什么是纯虚函数?C++之父谈

 此文为C++之父撰写,本篇为翻译

纯虚函数是指不必在基类中定义,但必须在派生类中被覆盖(override)的函数。通过新奇的“=0”语法可将虚函数声明为纯虚函数。例如:

class Base {
                public:
                        void f1();                         // 不是虚函数
                        virtual void f2();         // 是虚函数,但不是纯虚函数
                        virtual void f3() = 0;  // 纯虚函数
                };
                Base b; // error: pure virtual f3 not overridden

image.gif

在此,Base 是抽象类(因为它有一个纯虚函数),所以不能直接用它来定义对象:Base(很显然)是用来做基类的。例如:

class Derived : public Base {
                        // 没有定义 f1:没关系
                        // 没有定义 f2:没关系,继承了 Base::f2
                        void f3();
                };
                Derived d; // ok: Derived::f3 覆盖了 Base::f3

image.gif

抽象类是定义接口的非常好的工具。事实上,一个只有纯虚函数的类通常被称为接口。

当然你也可以定义纯虚函数:

Base::f3() { /* ... */ }

image.gif

这样做往往意义不大(虽然这样做可为派生类提供一些简单的公共代码),而且在派生类中仍然需要覆盖 Base::f3()。

如果你没有在派生类中覆盖纯虚函数,那该派生类也是抽象类:

class D2 : public Base {
                        // 没有定义 f1:没关系
                        // 没有定义 f2:没关系,继承了 Base::f2
                        // 没有定义 f3:没关系,但 D2 因此也是抽象类
                };
                D2 d; // 错误:没有覆盖纯虚函数 Base::f3
相关文章
|
2月前
|
编译器 C++
C++-带你走进多态(1)
C++-带你走进多态(1)
23 0
|
5月前
|
Python
跟我从0学Python——类的继承和多态
类的继承和多态 —— 面向对象编程的扩展与灵活性
|
6月前
|
存储 编译器 C++
【C++从0到王者】第三站:类和对象(中)拷贝构造函数
【C++从0到王者】第三站:类和对象(中)拷贝构造函数
30 0
|
7月前
|
算法 编译器 C++
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(中)
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(中)
26 0
|
7月前
|
算法 编译器 程序员
类与对象知识总结+构造函数和析构函数 C++程序设计与算法笔记总结(二) 北京大学 郭炜(下)
类与对象知识总结+构造函数和析构函数 C++程序设计与算法笔记总结(二) 北京大学 郭炜(下)
43 0
|
2月前
|
存储 编译器 C++
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
|
7月前
|
算法 安全 程序员
类与对象知识总结+构造函数和析构函数 C++程序设计与算法笔记总结(二) 北京大学 郭炜(上)
类与对象知识总结+构造函数和析构函数 C++程序设计与算法笔记总结(二) 北京大学 郭炜(上)
45 0
|
7月前
|
存储 算法 编译器
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)
类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)
26 0
|
2月前
|
存储 算法 编译器
【C++入门到精通】C++入门 —— 多态(抽象类和虚函数的魅力)
多态是面向对象编程中的一个重要概念,指的是同一个消息被不同类型的对象接收时产生不同的行为。通俗来说,**就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态**。
44 0
|
6月前
|
搜索推荐 编译器 C++
【C++从0到王者】第三站:类和对象(中)构造函数与析构函数
【C++从0到王者】第三站:类和对象(中)构造函数与析构函数
29 0