c++虽无interface关键字,但纯虚函数类可完全实现java接口语义:抽象类不可实例化、强制派生类实现、支持多重继承与解耦;析构需virtual,同名函数需显式限定,菱形继承须用virtual继承,纯虚函数可带定义。

直接说结论:C++ 没有 interface 关键字,但用「只含纯虚函数的类 + 多重继承」就能 100% 实现 Java 接口的所有语义——包括不能实例化、强制实现、解耦行为、组合能力。关键不是“像不像”,而是“能不能正确用”。
为什么你的 IReader 类无法 new 出对象?
只要类里有一个 virtual void func() = 0;,它就是抽象类,编译器会直接报错:error: cannot declare variable 'x' to be of abstract type 'IReader'。这不是 bug,是设计保障。
- 抽象类可以定义
IReader*或IReader&,用于多态调用 - 派生类哪怕只漏掉一个纯虚函数没
override,它仍是抽象类(别以为加了实现就自动“脱敏”) - 析构函数建议显式声明为
virtual ~IReader() = default;,否则通过基类指针 delete 可能内存泄漏
class FileIO : public IReader, public IWriter 编译失败?检查这三点
多重继承本身不难,但错误往往出在细节。常见卡点:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 两个接口里有同名函数(比如都叫
close()),不加限定调用会触发error: request for member 'close' is ambiguous;必须写成obj.IReader::close()或在派生类中显式转发 - 构造函数初始化列表顺序必须和继承声明顺序一致:
class FileIO : public IReader, public IWriter→ 初始化列表里IReader()必须写在IWriter()前面,否则编译器警告“base class initializer order differs from declaration order” - 如果两个接口都从同一个更上层基类(比如
IObject)继承,没加virtual就会触发菱形继承,导致子类含两份重复成员;此时必须写class IReader : virtual public IObject
纯虚函数真的一点实现都不能写?
可以写,而且有时必须写——比如想提供默认日志或资源清理逻辑,但又不希望子类“绕过”它。语法是:在类外定义函数体,但声明仍保留 = 0:
class ILogger {
public:
virtual void log(const char* msg) = 0;
};
void ILogger::log(const char* msg) {
std::cout <p>注意:这样写之后,子类仍必须 <code>override</code>,否则无法实例化;但可以在自己的 <code>log</code> 里调用 <code>ILogger::log(msg)</code> 复用逻辑。这是 C++ 特有的灵活性,Java interface 默认方法是另一条路。</p><p>真正容易被忽略的是:接口类的析构函数是否 <code>virtual</code>、多重继承时构造顺序是否与声明顺序严格一致、以及菱形继承场景下有没有无脑省略 <code>virtual</code>。这些地方一错,轻则二义性报错,重则运行时未定义行为——而编译器不会替你猜意图。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南









