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

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

C++ | 虚函数 | 问题10

什么是虚函数?

在 C++ 中,通过使用关键字 virtual 可以将一个类的成员函数定义为虚函数,例如:

class Animal {
public:
    virtual void eat() {
        std::cout << "Animal is eating." << std::endl;
    }
};

虚函数是多态性的基础。多态性是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。即,在程序运行过程中,将不同的对象赋给同一类型的指针,然后通过该指针调用该类型的函数时,可产生不同的执行结果。

什么是动态绑定?

C++中,如果一个函数是虚函数,那么它的调用将根据实际对象类型而不是指针或引用类型确定。这种在运行时确定函数调用的方式称为动态绑定或后期绑定。

例如:

Animal* ptr = new Animal();
ptr->eat();  // 输出 Animal is eating.

Animal* ptr2 = new Cat();
ptr2->eat();  // 输出 Cat is eating fish.

在上面的示例中,当 ptr 调用虚函数 eat 时,输出的结果是 Animal is eating.,而当 ptr2 调用虚函数 eat 时,输出的结果是 Cat is eating fish.。这是因为 Cat 继承了 Animal 并重写了 eat 函数,而调用时根据实际对象类型确定了调用结果。

什么是纯虚函数?

纯虚函数是通过在函数定义后面使用 =0 来声明的虚函数,例如:

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

纯虚函数没有函数体,因此不能被直接调用,需要在派生类中进行重写。一个含有纯虚函数的类是抽象类,不能被实例化,而只能被作为基类来派生出新的类。

例如:

class Cat : public Animal {
public:
    void eat() {
        std::cout << "Cat is eating fish." << std::endl;
    }
};

int main() {
    Cat cat;
    cat.eat();  // 输出 Cat is eating fish.
    return 0;
}

在上面的示例中, Cat 类继承了 Animal 类并重写了其纯虚函数 eat,因此编译器不再认为 Cat 是抽象类,可以进行实例化。

总结

虚函数是多态性的基础,可以在父类中定义,让子类在用同名函数进行“覆盖”时具有多态性;动态绑定是指在程序运行过程中确定函数调用的方式;纯虚函数是没有函数体的虚函数,只能被派生类重写,并作为抽象类的标识。