📄问题
纯虚函数是什么
📝我的回答
纯虚函数是C++中一种特殊的虚函数,它在基类中只有声明而没有实现,通过在函数声明后添加'= 0'来标识。例如:
class Shape {
public:
virtual double area() const = 0; // 纯虚函数
virtual ~Shape() {}
};
纯虚函数有几个重要特点和作用:
首先,包含纯虚函数的类被称为抽象类(Abstract Class)。抽象类不能被直接实例化,只能作为基类被继承。这是因为纯虚函数表示一个必须由派生类实现的接口,基类本身并不提供实现。如果尝试创建抽象类的对象,编译器会报错:
Shape s; // 编译错误:不能创建抽象类的对象
Shape* ps = new Shape(); // 同样错误
其次,派生类必须实现所有继承的纯虚函数,否则派生类也会变成抽象类。这强制派生类提供特定接口的实现:
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 必须实现area函数,否则Circle也是抽象类
double area() const override {
return 3.14159 * radius * radius;
}
};
第三,纯虚函数可以有实现,尽管这不太常见。定义方式是在类外单独实现:
class Base {
public:
virtual void foo() = 0; // 纯虚函数
};
// 纯虚函数的实现
void Base::foo() {
std::cout << "Base::foo implementation" << std::endl;
}
如果提供了实现,派生类可以选择调用基类的实现:
class Derived : public Base {
public:
void foo() override {
Base::foo(); // 调用纯虚函数的实现
std::cout << "Derived::foo" << std::endl;
}
};
纯虚函数在设计模式和软件架构中非常有用,主要用于以下场景:
定义接口:纯虚函数可以定义一个必须由派生类实现的接口,这是实现多态的强大工具。
实现"接口"概念:虽然C++没有像Java那样的interface关键字,但可以通过只包含纯虚函数的类来模拟接口。
强制派生类提供实现:当基类无法提供合理的默认实现时,可以将函数声明为纯虚函数,强制派生类提供特定功能。
纯虚函数与普通虚函数的区别在于,普通虚函数可以有默认实现,派生类可以选择重写或使用默认实现;而纯虚函数强制要求派生类提供实现(除非派生类也是抽象类)。