当前位置:首页 C++ > 正文

c++虚函数指针什么时候初始化

作者:野牛程序员:2023-08-01 16:53:15 C++阅读 2442

在C++中,虚函数指针是在创建对象时被初始化的。虚函数指针是一个指向虚函数表(virtual function table,vtable)的指针,用于实现多态性(polymorphism)。

当一个类中声明了虚函数时,C++会为这个类生成一个虚函数表(vtable)。虚函数表是一个指针数组,其中包含了该类中所有虚函数的地址。每个对象在创建时,都会被赋予一个指向其类的虚函数表的虚函数指针。

在构造对象时,C++会自动将虚函数指针初始化为指向正确的虚函数表。这是通过在对象内存布局中添加一个额外的指针来实现的,通常被称为虚指针(vptr)。虚指针指向对象的虚函数表,这样在调用虚函数时,就能够根据虚指针找到正确的函数地址。

虚函数指针的初始化是由编译器在构造对象时完成的,程序员不需要显式地初始化虚函数指针。当你通过创建类的对象或派生类的对象来调用虚函数时,虚函数指针已经被正确初始化,并能够正确地调用相应的虚函数。这也是C++中实现多态性的基础。

需要注意的是,在析构对象时,虚函数指针也会自动被销毁,并且由于虚函数指针在构造对象时已经被正确初始化,所以在析构对象时,也能够正确调用派生类的析构函数(如果有的话)来实现多态性的正确析构。

#include <iostream>

class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Square : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a square." << std::endl;
    }
};

int main() {
    Shape* shape1 = new Circle();
    Shape* shape2 = new Square();

    shape1->draw(); // Output: "Drawing a circle."
    shape2->draw(); // Output: "Drawing a square."

    delete shape1;
    delete shape2;

    return 0;
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击