惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
博客园 - Franky
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
S
SegmentFault 最新的问题
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
B
Blog RSS Feed
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare Blog
博客园_首页
博客园 - 聂微东
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏

博客园 - GKLBB

软件研发 --- AI模型 之 图片转xlsx 软件神器 --- ctf靶场 之 pwn.college 术语俗话 --- 什么是加密狗 软件神器 --- 自动电脑锁屏软件 软件研发 --- 网络安全 之 putty生成无密码登录密钥 软件神器 --- 视频剪辑 之 Avidemux MP4Joiner Shotcut 软件神器 --- 视频格式转化 之 handbrake 软件研发 --- 经验之谈 这个是什么图标,经常看到 软件研发 --- 术语俗话 之 多模态 术语俗话 --- 什么是大数据开发 软件研发 --- 术语俗话 之 什么是边缘计算 软件研发 --- 应知应会 之 什么是云计算开发 应知应会 --- 如何不装软件查看网速 常见问题解决 --- 360拦截接触 常见问题解决 --- 加入会议摄像头无法打开 网络安全 --- CTF打靶 之 ZIP伪加密 → Robot36慢扫电视 → 二维码补齐 → DeepSound隐写 → GPG解密 → Base64图片 → SilentEye隐写 软件研发 --- 应知应会 之 无错误的闪退如何解决 软件研发 --- 应知应会 之 为什么别人的软件如此复杂我的如此简单 网络安全 --- 应知应会 之 什么是旁站 应知应会 --- 如何查询备案 软件神器 --- 格式转化 之 jpg 2 svg 网络安全 --- CTF打靶 之 flag搜索 软件神器 --- 互联网测速 之 软件神器 --- 局域网测速 之 iperf 常见问题解决 --- 模拟器USG6000打开后,启动设备失败,错误40 软件研发 --- AI网络 之 ensp配置生成 软件研发 --- AI编程 之 极简流程 软件研发 --- AI生图产品比较 常见问题解答 --- 为什么我的服务一直被人DDOS
俗语俗话 --- 纯虚函数
GKLBB · 2026-04-23 · via 博客园 - GKLBB

纯虚函数是就是java中的接口函数

纯虚函数 vs Java 接口函数

结论:大致类似,但不完全相同


相似之处(让你产生这个直觉的原因)

C++

// C++ 纯虚函数
class Animal {
public:
    virtual void speak() = 0;  // 纯虚函数,子类必须实现
};

Java

// Java 接口
interface Animal {
    void speak();  // 接口函数,实现类必须实现
}

这两种写法都在说同一件事:

"我只定义规范,不写具体实现,你来实现它"


关键差异

差异1:纯虚函数可以有函数体,Java接口在JDK8之前不行

C++

// C++ 允许纯虚函数有实现体(罕见但合法)
class Animal {
public:
    virtual void speak() = 0;  // 声明为纯虚
};

// 类外单独提供实现(子类仍然必须重写,但可以主动调用父类版本)
void Animal::speak() {
    printf("我是默认声音");
}

class Dog : public Animal {
public:
    void speak() override {
        Animal::speak();        // 可以主动调用父类的纯虚实现
        printf("汪汪");
    }
};

Java

// Java 8 之前接口函数完全不能有实现
// Java 8 之后才加入 default 方法
interface Animal {
    default void speak() {      // 必须加 default 关键字才能有实现
        System.out.println("默认声音");
    }
}

差异2:抽象类 vs 纯虚函数 的归属不同

C++

// C++:一个类只要有一个纯虚函数,它就自动成为抽象类
// 抽象类里可以混合放:普通函数、普通虚函数、纯虚函数
class Animal {
public:
    void breathe() {            // 普通函数:有实现,不能被重写覆盖
        printf("呼吸");
    }
    virtual void move() {       // 普通虚函数:有默认实现,子类可以选择重写
        printf("移动");
    }
    virtual void speak() = 0;  // 纯虚函数:无实现,子类必须重写
};

Java

// Java 中这三种东西分属两个概念
interface Animal {
    void speak();               // 接口函数:必须实现(对应纯虚函数)
}

abstract class AnimalBase {
    public void breathe() {     // 普通函数:有实现
        System.out.println("呼吸");
    }
    public abstract void speak(); // 抽象函数:必须实现(也对应纯虚函数)
}

差异3:多继承支持不同

C++

// C++:可以同时继承多个含纯虚函数的类(多继承)
class Flyable {
public:
    virtual void fly() = 0;
};

class Swimmable {
public:
    virtual void swim() = 0;
};

class Duck : public Flyable, public Swimmable {  // 同时继承两个
public:
    void fly() override  { printf("飞"); }
    void swim() override { printf("游"); }
};

Java

// Java:类不能多继承,但可以实现多个接口(规避了多继承的二义性问题)
interface Flyable  { void fly();  }
interface Swimmable { void swim(); }

class Duck implements Flyable, Swimmable {       // 实现多个接口
    public void fly()  { System.out.println("飞"); }
    public void swim() { System.out.println("游"); }
}

一张表总结

对比维度C++ 纯虚函数Java 接口函数
强制子类实现
自身可以有实现体 ✅ 可以(罕见) ⚠️ 需加 default
所在结构 抽象类内部 interface 内部
多继承 ✅ 直接支持 ✅ 通过多接口实现
数据成员 ✅ 抽象类可以有 ❌ 接口只能有常量

一句话总结

纯虚函数 ≈ Java 抽象类中的 abstract 方法
纯虚函数所在的抽象类 ≈ Java 的 interface
方向对了,但对应关系不是百分之百精确

免责声明 本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发及其他违反《中华人民共和国网络安全法》《数据安全法》等法律法规的行为,使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。