📜  C++中虚函数和纯虚函数之间的区别(1)

📅  最后修改于: 2023-12-03 14:59:51.713000             🧑  作者: Mango

C++中虚函数和纯虚函数之间的区别

在C++中,虚函数和纯虚函数是两个特殊的函数类型,本文将介绍它们之间的区别。

虚函数

虚函数是一种可以被子类重写的函数。虚函数在父类中被声明为虚函数,子类中可以通过重写该函数来实现自己的功能。

使用虚函数需要满足以下条件:

  • 该函数必须在父类中声明为 virtual 关键字
  • 子类中重写该函数时需要保持函数签名一致

下面是一个简单的例子:

class Animal {
public:
    virtual void speak() {
        std::cout << "Animal speaks." << std::endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {
        std::cout << "Dog barks." << std::endl;
    }
};

int main() {
    Animal* animal = new Dog;
    animal->speak(); // 输出:Dog barks.
    delete animal;
    return 0;
}

在上面的例子中,父类 Animal 声明了一个虚函数 speak。子类 Dog 重写了该函数,并实现了自己的 speak 函数。在 main 函数中,我们用基类指针指向子类实例,并调用虚函数 speak。由于 speak 是虚函数,会根据基类指针实际指向的对象调用对应的子类函数,最终输出 Dog barks.

纯虚函数

纯虚函数是指在父类中没有具体实现的虚函数,可以用 = 0 来指定。子类必须实现纯虚函数,否则无法实例化。

使用纯虚函数需要满足以下条件:

  • 该函数在父类中声明为 virtual 关键字,且没有实现
  • 子类必须实现该函数,否则无法实例化

下面是一个简单的例子:

class Shape {
public:
    virtual double getArea() const = 0;
};

class Rectangle : public Shape {
public:
    Rectangle(double width, double height) : width_(width), height_(height) {}
    double getArea() const override { return width_ * height_; }
private:
    double width_;
    double height_;
};

int main() {
    Shape* shape = new Rectangle(2.0, 3.0);
    std::cout << "The area of the rectangle is " << shape->getArea() << std::endl; // 输出:The area of the rectangle is 6
    delete shape;
    return 0;
}

在上面的例子中,父类 Shape 声明了一个纯虚函数 getArea。子类 Rectangle 继承了该函数,并实现了自己的 getArea 函数。在 main 函数中,我们用基类指针指向子类实例,并调用纯虚函数 getArea。由于 getArea 是纯虚函数,子类必须实现它,否则无法实例化。最终输出 The area of the rectangle is 6

总结

虚函数和纯虚函数都是非常重要的概念,虚函数可以被子类重写,实现自己的功能,纯虚函数则必须在子类中实现,否则无法实例化。对于面向对象编程来说,熟悉虚函数和纯虚函数是非常必要的。