📅  最后修改于: 2023-12-03 14:59:51.713000             🧑  作者: Mango
在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
。
虚函数和纯虚函数都是非常重要的概念,虚函数可以被子类重写,实现自己的功能,纯虚函数则必须在子类中实现,否则无法实例化。对于面向对象编程来说,熟悉虚函数和纯虚函数是非常必要的。