📜  虚函数 c++ (1)

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

虚函数 C++

在 C++ 中,虚函数是一种允许在子类中重写父类函数的机制。虚函数的使用可以实现多态,即同一个函数在不同情况下表现出不同的行为。

定义

定义一个虚函数需要在函数名前添加关键字 virtual,例如:

class Animal {
public:
    virtual void makeSound() {
        std::cout << "Base sound\n";
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Meow\n";
    }
};

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

在上面的代码中,Animal 类有一个虚函数 makeSound(),它的子类 CatDog 均重写了该函数。

注意,派生类函数的函数头必须与基类函数的函数头完全相同,包括返回类型、函数名和参数列表。因此在 C++11 引入了 override 关键字,用以标记函数是否重写了基类中的虚函数,如上述例子中的 makeSound()

多态

多态性是指:同一行为在不同情况下具有不同的表现形式,即一个对象具有多种形态。

假设有一个函数 outputSound(),可以接收 Animal 类型的参数并调用其 makeSound() 函数输出声音。

void outputSound(Animal& animal) {
    animal.makeSound();
}

当调用该函数时,若传入一个 Cat 类型的参数,则输出 “Meow”;若传入一个 Dog 类型的参数,则输出 “Woof”。

Cat cat;
Dog dog;

outputSound(cat); // output: Meow
outputSound(dog); // output: Woof

这就是多态。因为同一个函数 outputSound() 在不同的情况下表现出不同的行为。

纯虚函数

纯虚函数是一种特殊的虚函数,在它的定义中没有函数体,例如:

class Animal {
public:
    virtual void makeSound() = 0;
};

class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Meow\n";
    }
};

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

在上述代码中,Animal 类中的 makeSound() 函数没有函数体,它成为了一个纯虚函数。任何派生类都必须实现该函数,否则它也会成为抽象类。

总结

虚函数是实现多态的重要机制,它允许子类重写父类函数。纯虚函数是一种特殊的虚函数,没有函数体,任何派生类都必须实现该函数。在使用虚函数时,还要注意虚函数的正确覆盖和多继承问题。