c语言编程笔录

首页 >   > 笔记大全

笔记大全

C++虚函数表与多态实例代码分析

更新时间:2023-07-19

前言

C++中的虚函数是实现多态的重要机制之一,通过虚函数表来实现动态调用函数。

虚函数表

C++中的虚函数通过虚函数表来实现。每个带有虚函数的对象,都包含一个指向虚函数表的指针,这个指针位于对象的头部。虚函数表是一个存储函数指针的数组,它包含了这个类中的虚函数及其派生类的虚函数。虚函数表的指针通过对象的指针去访问。当通过基类指针调用虚函数时,会根据对象的实际类型在虚函数表中查找相应的函数来执行。
class Base {
public:
    virtual void func1() {
        cout << "Base::func1" << endl;
    }
    virtual void func2() {
        cout << "Base::func2" << endl;
    }
};

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

int main() {
    Base* ptr = new Derived();
    ptr->func1(); // 输出 Base::func1
    ptr->func2(); // 输出 Derived::func2
    delete ptr;
    return 0;
}
以上示例代码中,虚函数表的指针位于Base类的对象的头部。当通过ptr指针调用虚函数时,编译器会通过ptr指针找到Base类对象的虚函数表指针,然后根据虚函数表指针找到对应的虚函数进行执行。在多态的情况下,根据对象的实际类型找到正确的虚函数。

多态

多态是指在父类和子类之间存在同名的虚函数,在运行时根据对象的实际类型来确定调用哪个函数。多态能够使程序更加灵活和可扩展,增加了代码的可读性和可维护性。
class Animal {
public:
    virtual void sound() {
        cout << "Animal makes a sound." << endl;
    }
};

class Dog : public Animal {
public:
    void sound() override {
        cout << "Dog barks." << endl;
    }
};

class Cat : public Animal {
public:
    void sound() override {
        cout << "Cat meows." << endl;
    }
};

int main() {
    Animal* animals[] = {new Dog(), new Cat()};
    for (int i = 0; i < 2; i++) {
        animals[i]->sound();
    }
    for (int i = 0; i < 2; i++) {
        delete animals[i];
    }
    return 0;
}
在以上示例代码中,Animal类是一个基类,它有一个虚函数sound。Dog和Cat类是Animal类的派生类,并且重写了sound函数。在main函数中,使用Animal指针数组来存储Dog和Cat对象,通过循环调用sound函数时,根据对象的实际类型,调用对应的虚函数。这样可以使得程序更加灵活,可以扩展多个不同类型的动物。

总结

通过虚函数表和多态的机制,C++能够实现面向对象编程中的多态特性。虚函数表是存储虚函数指针的数组,每个带有虚函数的对象都包含一个指向虚函数表的指针。在多态的情况下,根据对象的实际类型找到正确的虚函数来执行。多态能够使程序更加灵活和可扩展,增加了代码的可读性和可维护性。通过使用虚函数和多态,可以更好地使用C++的面向对象特性,编写出更加灵活和可扩展的代码。