📜  C ++ |虚函数|问题11(1)

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

C++ | 虚函数 | 问题11

在C++中,虚函数是一个类成员函数,它可以在派生类中被重写并覆盖基类中的同名函数。虚函数通过动态绑定实现多态性,是面向对象编程中的重要概念。

基本语法
class Base {
public:
    virtual void call() {
        std::cout << "Base::call" << std::endl;
    }
};

class Derived : public Base {
public:
    void call() override {
        std::cout << "Derived::call" << std::endl;
    }
};

int main() {
    Base *obj = new Derived();
    obj->call(); // 输出 "Derived::call"
    delete obj;
    return 0;
}

代码中定义了一个基类 Base 和一个派生类 Derived,它们都有一个名为 call 的虚函数。在 main 函数中,我们创建了一个 Derived 对象的指针,并将其类型转换为指向 Base 类型的指针。当我们调用 obj->call() 方法时,实际上调用的是 Derived 中的 call 函数,因为 obj 指针指向一个 Derived 类型的对象。

虚析构函数

在需要通过指针或引用来使用派生类对象的情况下,我们通常需要在基类中定义一个虚析构函数。虚析构函数是一个在基类中被声明为虚函数的析构函数,它确保在释放派生类对象时调用正确的析构函数。

class Base {
public:
    virtual ~Base() {};
};

class Derived : public Base {
public:
    ~Derived() {};
};

int main() {
    Base *obj = new Derived();
    delete obj; // 调用 Derived 的析构函数
    return 0;
}

在上面的例子中,我们在基类 Base 中声明了一个虚析构函数,然后在派生类 Derived 中定义了自己的析构函数。当我们通过指向 Derived 对象的 Base 指针释放该对象时,系统调用了 Derived 类的析构函数。

纯虚函数

有时候,我们需要在基类中定义一个函数,但这个函数在基类中没有实际实现,这种函数称为“纯虚函数”。纯虚函数的声明形式是在函数原型的末尾加上 = 0,例如:

class Base {
public:
    virtual void call() = 0;
};

class Derived : public Base {
public:
    void call() override {
        std::cout << "Derived::call" << std::endl;
    }
};

int main() {
    Base *obj = new Derived();
    obj->call(); // 输出 "Derived::call"
    delete obj;
    return 0;
}

在这个例子中,我们将 Base 类的 call 函数定义为纯虚函数,并在派生类 Derived 中实现了它。在 main 函数中,我们创建了一个 Derived 对象的指针,并将其类型转换为指向 Base 类型的指针。当我们调用 obj->call() 方法时,实际上调用的是 Derived 中的 call 函数,因为 obj 指针指向一个 Derived 类型的对象。

总结

虚函数是实现多态性的重要概念,在面向对象编程中起着重要的作用。在使用虚函数时,需要注意虚析构函数和纯虚函数的定义和使用。