讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 纯虚函数怎么定义 C++抽象类与接口规范讲解【架构】

陌芳君_4466

陌芳君_4466

发布时间:2026-01-27 14:49:02

|

265人浏览过

|

来源于php中文网

原创

纯虚函数必须声明为virtual void f() = 0且无函数体;含纯虚函数的类为抽象类,不可实例化但可定义指针/引用;接口类应仅含public纯虚函数、无数据成员和非纯虚函数;多重继承时各基类纯虚函数须分别显式实现。

c++ 纯虚函数怎么定义 c++抽象类与接口规范讲解【架构】

纯虚函数的定义语法必须带 = 0

纯虚函数不是“没实现的虚函数”,而是**语法上强制要求子类重写**的虚函数。它的定义必须在声明末尾写 = 0,且不能有函数体(哪怕空花括号也不行):

class Shape {
public:
    virtual double area() const = 0;  // ✅ 正确:= 0,无实现
    virtual void draw() = 0;         // ✅ 同样合法,const 不是必需的
    virtual void init() = 0 {}       // ❌ 错误:写了 {} 就不能再写 = 0
};

常见错误是把普通虚函数和纯虚函数混淆——比如只写 virtual void f(); 而不加 = 0,这仍是可实例化的虚函数,不会让类变成抽象类。

抽象类无法实例化,但可以定义指针和引用

只要类中至少有一个纯虚函数,它就是抽象类,new Shape() 或 Shape s; 都会编译失败,报错类似:error: cannot declare variable 's' to be of abstract type 'Shape'。

但你完全可以:

立即学习“C++免费学习笔记(深入)”;

  • 用 Shape* 指向派生类对象(多态基础)
  • 用 const Shape& 绑定临时对象或子类实例
  • 作为函数参数或返回类型(如工厂函数返回 std::unique_ptr<shape></shape>)

注意:抽象类的构造函数/析构函数仍会被调用,所以析构函数建议也声明为 virtual ~Shape() = default;,否则通过基类指针 delete 可能导致未定义行为。

接口类(Interface)要避免数据成员和非纯虚函数

C++ 没有 interface 关键字,所谓“接口类”是靠约定形成的规范:只含 public 纯虚函数、无数据成员、无构造函数实现、析构函数为纯虚或虚默认。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

典型反例:

class BadInterface {
protected:
    int id_;                    // ❌ 数据成员破坏接口纯洁性
public:
    virtual void run() = 0;
    virtual void stop() { }     // ❌ 提供默认实现,就不是纯粹的契约了
};

更干净的写法:

class Drawable {
public:
    virtual ~Drawable() = default;
    virtual void draw() const = 0;
    virtual void update() = 0;
};

如果真需要默认行为,应由派生类自己用组合或模板方式复用,而不是在接口里塞实现。

多重继承下纯虚函数的实现容易漏覆盖

当一个类从多个抽象基类继承时,每个纯虚函数都必须被显式实现,哪怕签名完全一样也不能“自动继承”:

class A { public: virtual void f() = 0; };
class B { public: virtual void f() = 0; };
class C : public A, public B {
public:
    void f() override { }  // ✅ 必须写,否则 C 仍是抽象类
};

若遗漏,编译器不会帮你合并或提示“已实现”,只会继续报错 C is an abstract class。更隐蔽的情况是签名看似相同但 const/volatile 限定符不一致,比如 A::f() 和 B::f() const 是两个不同函数,C 必须分别实现。

这种细节在大型模块解耦或跨团队接口对接时特别容易出问题,建议配合静态分析工具(如 clang-tidy 的 cppcoreguidelines-interfaces-global-init 类规则)做检查。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1029

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3280

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2358

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

814

2025.10.23

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn