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

📅  最后修改于: 2023-12-03 15:29:55.049000             🧑  作者: Mango

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

在C++中,虚函数和纯虚函数是面向对象编程中的两个非常重要的概念。虚函数允许子类覆盖父类中的函数,而纯虚函数则是一种抽象的概念,它没有具体的实现,只有一个函数原型。

虚函数

虚函数是一种允许子类覆盖父类中函数的方法。在使用虚函数时,要在函数声明前添加关键字“virtual”。例如:

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

在上面的例子中,我们定义了一个Animal类和一个Dog类。Animal类有一个虚函数speak(),在Dog类中重写了这个函数。当我们使用这个类的对象时,调用speak()函数时,将会根据对象的类型自动选择正确的函数。例如:

Animal *a = new Animal();
a->speak();   // output: Animal speaks!

Dog *d = new Dog();
d->speak();   // output: Dog barks!

Animal *ad = d;
ad->speak();  // output: Dog barks!

在上面的代码中,我们下了两个对象,一个是Animal类型的,一个是Dog类型的。我们分别调用了它们的speak()函数,并且打印了输出结果。我们还定义了一个Animal类型的指针ad,并将它指向Dog类型的对象。当我们调用ad->speak()时,输出的结果是Dog barks!。这是因为虚函数实现了多态,根据对象的实际类型自动选择正确的函数。

纯虚函数

一个纯虚函数是一个没有实现的虚函数。我们可以使用关键字“=0”来声明一个纯虚函数。例如:

class Shape {
protected:
    int width, height;
public:
    Shape(int w, int h) : width(w), height(h) {}
    virtual int area() = 0;
};

在上面的代码中,我们定义了一个Shape类,其中有一个纯虚函数area()。这个函数没有任何实现,它只是一个接口,表示这个类必须要实现这个函数。任何继承自Shape的类必须要实现area()函数。例如:

class Rectangle : public Shape {
public:
    Rectangle(int w, int h) : Shape(w, h) {}
    int area() override {
        return width * height;
    }
};

在上面的代码中,我们定义了一个Rectangle类,它继承自Shape类。Rectangle类必须要实现area()函数,否则编译器将会报错。我们重写了这个函数,计算并返回了矩形的面积。同样的,我们还可以定义一个Circle类:

class Circle : public Shape {
public:
    Circle(int r) : Shape(r, r) {}
    int area() override {
        return 3.14 * width * width;
    }
};

在上面的代码中,我们定义了一个Circle类,它继承自Shape类。与Rectangle类类似,Circle类必须要实现area()函数。

总结一下,虚函数和纯虚函数都是C++程序设计中非常重要的概念。虚函数可以实现多态,纯虚函数则是一个抽象的接口,表示子类必须要实现这个函数。在面向对象编程中,虚函数和纯虚函数是非常有用的,可以方便地实现多态等功能。