当前位置:   article > 正文

C++ 高级面试题:解释 C++ 中的抽象基类和纯虚函数_抽象基类 c++

抽象基类 c++

解释 C++ 中的抽象基类和纯虚函数

在C++中,抽象基类和纯虚函数是面向对象编程中的重要概念,用于实现多态性和接口规范。它们通常与继承和多态结合使用,以实现接口的统一定义和派生类的不同实现。

抽象基类(Abstract Base Class):
抽象基类是一个包含纯虚函数的类,它用于定义接口规范但不能被实例化。抽象基类的存在是为了提供一种接口,而不是具体的实现。抽象基类只能作为其他类的基类,派生类必须实现所有基类的纯虚函数才能被实例化。

纯虚函数(Pure Virtual Function):
纯虚函数是在基类中声明的虚函数,但没有提供具体的实现。它的声明方式是在函数声明后加上 = 0。纯虚函数告诉编译器,派生类必须提供自己的实现来满足接口规范。

示例:

// 抽象基类
class Shape {
public:
    // 纯虚函数,表示该函数在基类中没有实现
    virtual double area() const = 0;
};

// 派生类1
class Circle : public Shape {
private:
    double radius;

public:
    // 实现纯虚函数 area()
    double area() const override {
        return 3.14159 * radius * radius;
    }
};

// 派生类2
class Rectangle : public Shape {
private:
    double width;
    double height;

public:
    // 实现纯虚函数 area()
    double area() const override {
        return width * height;
    }
};

int main() {
    // Shape* 类型的指针可以指向派生类对象
    Shape* shape1 = new Circle();
    Shape* shape2 = new Rectangle();

    // 使用指针调用纯虚函数 area(),根据对象的实际类型调用对应的实现
    double area1 = shape1->area();
    double area2 = shape2->area();

    delete shape1;
    delete shape2;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

在这个示例中,Shape 是一个抽象基类,它包含一个纯虚函数 area()。Circle 和 Rectangle 是 Shape 的两个派生类,它们都必须实现 area() 函数才能被实例化。通过使用抽象基类和纯虚函数,我们可以实现多态性,让不同类型的对象都可以以统一的接口进行操作。

更详细具体的内容

抽象基类和纯虚函数在 C++ 中是实现多态性和接口规范的关键机制。让我们更详细地了解它们,并通过一个更复杂的示例来说明它们的用法。

抽象基类(Abstract Base Class):
抽象基类是一个包含纯虚函数的类,它负责定义接口规范,但不能被实例化。抽象基类的目的是为了提供一种通用的接口,供派生类实现。在抽象基类中,可以包含普通的成员函数和数据成员,但通常不会包含完整的实现,因为它们没有意义。

纯虚函数(Pure Virtual Function):
纯虚函数是在基类中声明的虚函数,但没有提供具体的实现。它的声明方式是在函数声明后加上 = 0。纯虚函数告诉编译器,派生类必须提供自己的实现来满足接口规范。

示例:

#include <iostream>

// 抽象基类 Shape
class Shape {
public:
    // 纯虚函数 area(),表示该函数在基类中没有实现
    virtual double area() const = 0;

    // 普通成员函数,可在基类中提供默认实现
    void printArea() const {
        std::cout << "Area: " << area() << std::endl;
    }

    // 虚析构函数,确保正确释放资源
    virtual ~Shape() {}
};

// 派生类 Circle
class Circle : public Shape {
private:
    double radius;

public:
    // 实现纯虚函数 area()
    double area() const override {
        return 3.14159 * radius * radius;
    }

    // 构造函数
    Circle(double r) : radius(r) {}
};

// 派生类 Rectangle
class Rectangle : public Shape {
private:
    double width;
    double height;

public:
    // 实现纯虚函数 area()
    double area() const override {
        return width * height;
    }

    // 构造函数
    Rectangle(double w, double h) : width(w), height(h) {}
};

int main() {
    // 创建 Circle 对象和 Rectangle 对象
    Circle circle(5.0);
    Rectangle rectangle(4.0, 6.0);

    // 使用基类指针操作派生类对象,体现多态性
    Shape* shape1 = &circle;
    Shape* shape2 = &rectangle;

    // 调用基类的成员函数,实际调用派生类的实现
    shape1->printArea(); // 输出: Area: 78.5398
    shape2->printArea(); // 输出: Area: 24

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

这个示例中,Shape 是一个抽象基类,它包含一个纯虚函数 area()。Circle 和 Rectangle 分别是 Shape 的两个派生类,它们都必须实现 area() 函数才能被实例化。通过使用抽象基类和纯虚函数,我们实现了多态性,让不同类型的对象都可以以统一的接口进行操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/926385
推荐阅读
相关标签
  

闽ICP备14008679号