📜  C++虚函数(1)

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

C++虚函数

在C++中,虚函数是一种特殊的函数,它允许派生类重写基类中的函数实现。使用虚函数可以实现多态和运行时多态性,因为它允许在运行时动态地绑定函数调用。

定义一个虚函数

使用 virtual 关键字来定义一个虚函数。例如,以下代码定义了一个基类 Animal,其中 makeSound 函数是虚函数。

class Animal {
public:
    virtual void makeSound() {
        std::cout << "Animal makes sound!" << std::endl;
    }
};

在派生类中,可以重写 makeSound 函数,实现不同的行为。例如,以下代码定义了一个派生类 Dog,它重写了 makeSound 函数。

class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Woof!" << std::endl;
    }
};

注意使用 override 关键字来标记派生类中的函数,这可以防止在重写时出现错误的签名,从而帮助生成更安全和可读的代码。

多态和运行时多态性

使用虚函数可以在运行时实现多态性。例如,以下代码展示了动态绑定的行为:

Animal* animal = new Dog();
animal->makeSound(); // Output: Woof!

在此示例中,makeSound 函数的调用在运行时确定,因为它是虚函数,并且 animal 指针指向一个派生类 Dog 的实例。因此,输出是 Woof!

虚析构函数

如果您的类使用了动态内存分配,应该使用虚析构函数。这是因为在释放派生类中的对象时,可能发生内存泄漏。虚析构函数可以确保正确地调用派生类和基类的析构函数来清理动态分配的内存。

以下是使用虚析构函数的示例:

class Animal {
public:
    virtual ~Animal() = default;
};

class Dog : public Animal {
public:
    ~Dog() override = default;
};

在此示例中,Animal 类具有虚析构函数,Dog 类重写了该函数。这确保了在删除 Dog 对象时,正确调用了 AnimalDog 的析构函数。

总结

虚函数是C++中实现多态的重要工具。使用虚函数,可以在运行时动态绑定函数调用,从而实现多态和运行时多态性。同时,应该注意在使用动态内存分配时使用虚析构函数来防止内存泄漏。