接口继承
接口继承是指子类只继承基类的纯虚函数,即只继承基类的接口,而不继承基类的实现,子类必须实现基类中的所有纯虚函数,否则子类也成为抽象类
#include<iostream>
using namespace std;
// 纯虚类,用作接口
class Shape {
public:virtual ~Shape() = default;//显式地使用= default来指定默认析构函数virtual void draw() const = 0; // 纯虚函数,派生类必须实现
};class Circle : public Shape {
public:void draw() const {// Circle 特有的实现std::cout << "Drawing Circle" << std::endl;}
};
int main() {Shape* s = new Circle();s->draw();
}
实现接口
实现继承是指子类不仅继承基类的接口,还继承基类的实现,子类可以重写基类的函数,也可以直接使用基类的函数实现
#include<iostream>
using namespace std;
// 纯虚类,用作接口
class Shape {
public:virtual ~Shape() = default;// 提供默认实现virtual void draw() const {std::cout << "Drawing a generic shape" << std::endl;}
};class Circle : public Shape {
public:void draw() const override {// 调用基类实现,避免重复代码Shape::draw();std::cout << "Specifically drawing a circle" << std::endl;}private:double radius = 1.0;
};
int main() {Circle c;Shape& s = c;s.draw();return 0;
}
应用场景
接口继承:适用于定义一组通用的接口,让不同的类实现这个接口,以实现多态性,例如,在图形绘画系统中,可以定义一个抽象的图形接口类,让不同的具体图形实现这个接口
实现继承:适用于已有类的基础上进行扩展和修改,继承基类的实现可以减少代码的重复。