接口继承和实现继承
什么是接口继承和实现继承?
在面向对象编程(OOP)中,接口继承(Interface Inheritance) 和 实现继承(Implementation Inheritance) 是两种不同的继承方式,它们的核心区别在于 继承的是行为约定还是具体实现。
接口继承 | 实现继承 | |
继承内容 | 只继承方法的声明,不继承实现。 | 继承父类的实现 |
对象 | 被继承对象为 抽象类 以及 接口 | 通过普通类或虚函数实现 |
目的 | 定义”能做什么“ (行为规范) | 复用方法,复用代码逻辑,减少重复 |
子类责任 | 必须实现所有抽象方法 | 根据动机选择性重写方法 |
耦合性 | 低耦合 | 高耦合 |
典型应用 | 多态、插件架构、API设计 | 代码复用 |
接口继承
// 接口(纯抽象类,只有方法声明)
class IShape {
public:virtual double area() const = 0; // 纯虚函数,子类必须实现virtual void draw() const = 0; // 无默认实现
};// 子类实现接口
class Circle : public IShape {
private:double radius;
public:Circle(double r) : radius(r) {}double area() const override { // 必须实现return 3.14 * radius * radius;}void draw() const override { // 必须实现std::cout << "Drawing a circle\n";}
};
实现继承
// 基类(包含默认实现)
class Animal {
public:virtual void speak() { // 虚函数,有默认实现std::cout << "Animal sound\n";}void eat() { // 非虚函数,直接继承std::cout << "Eating...\n";}
};// 子类选择性重写
class Dog : public Animal {
public:void speak() override { // 重写父类实现std::cout << "Woof!\n";}// eat() 直接继承父类实现
};class Cat : public Animal {// 不重写 speak(),默认使用父类实现
};