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