C++虚函数详解
虚函数概念
虚函数是一个特殊的类成员函数,它可以在派生类中进行重写,并且在运行时动态决定调用哪个版本。虚函数可以实现运行时的多态性,是面向对象编程的重要特性。
在C++中,我们通常使用关键字 virtual
来声明一个虚函数,如下所示:
class Shape {
public:
virtual void draw() {
std::cout << "Drawing Shape" << std::endl;
}
};
class Line : public Shape {
public:
void draw() override {
std::cout << "Drawing Line" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing Circle" << std::endl;
}
};
int main() {
Shape *shape;
Line line;
Circle circle;
shape = &line;
shape->draw(); // Drawing Line
shape = &circle;
shape->draw(); // Drawing Circle
return 0;
}
在上面的代码中,我们定义了三个类 Shape、Line 和 Circle,其中 Shape 类定义了一个虚函数 draw(),它被重写了。Line 和 Circle 类在继承 Shape 类的同时,也重写了 Shape 类的虚函数 draw()。在 main() 函数中,我们创建了一个指针 shape,并将它分别指向 Line 类和 Circle 类的对象。当我们调用 shape->draw() 函数时,程序会自动判断当前 shape 指针指向的对象类型,并调用该对象中的 draw() 函数,实现了多态性的效果。
虚函数表
C++中的虚函数通过虚函数表来实现,每个包含虚函数的类都会有一个虚函数表,其中存储着该类所有虚函数的地址。在对象被创建时,每个对象都会有一个指向虚函数表的指针,这个指针通常被称为虚函数指针。当一个类被派生时,虚函数表也会被随之继承,并被其派生类所共享。
当程序调用一个虚函数时,实际调用的是虚函数表中存储的函数地址。因为虚函数表不同于一般的静态表,它需要在程序运行期间动态生成并填充,以便实现多态性。下面是一个简单的示例,说明虚函数表的作用。
#include<iostream>
class Shape {
public:
virtual void draw() {
std::cout << "Drawing Shape" << std::endl;
}
};
void printVTable(void *obj_ptr) {
size_t *vptr = *(size_t **)obj_ptr;
std::cout << "Address of virtual table: " << vptr << std::endl;
std::cout << " First function: " << (void *)vptr[0] << std::endl;
std::cout << " Second function: " << (void *)vptr[1] << std::endl;
std::cout << " Third function: " << (void *)vptr[2] << std::endl;
}
class Line : public Shape {
public:
void draw() override {
std::cout << "Drawing Line" << std::endl;
}
};
int main() {
Shape *shape;
Line line;
shape = &line;
shape->draw();
printVTable(&line);
return 0;
}
在上面的代码中,我们定义了一个 Shape 类,并在其中定义了一个虚函数 draw()。我们再定义一个派生类 Line,它重写了 Shape 类的虚函数 draw()。在 main() 函数中,我们创建了一个指针 shape,并将它指向 Line 类的一个对象。当我们调用 shape->draw() 函数时,程序会输出 "Drawing Line"。
接着,我们调用了函数 printVTable(&line),打印出了 Line 类的虚函数表。由输出结果可知,虚函数表中存储了三个函数地址,其中包括了 Line 类的 draw() 函数的地址。
总结
C++中的虚函数实现了面向对象编程中重要的特性——多态性。虚函数通过虚函数表来实现,在程序运行期间动态决定调用哪个函数。虚函数的实现在 C++ 程序设计中具有重要意义,它是实现多态性的重要手段之一。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 虚函数及虚函数表详解 - Python技术站