当前位置: 首页 > news >正文

俗语俗话 --- 纯虚函数

俗语俗话 --- 纯虚函数

纯虚函数是就是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
方向对了,但对应关系不是百分之百精确