[CareerCup] 13.3 Virtual Functions 虚函数

简介:

13.3 How do virtual functions work in C++?

这道题问我们虚函数在C++中的工作原理。虚函数的工作机制主要依赖于虚表格vtable,即Virtual Table。当类中定义了虚函数时,一个虚表格就建立了用来保存该类的虚函数的地址。此时编译器Compiler也会在该类中增加一个虚指针vptr(Virtual Pointer),用来指向虚表格。当一个虚函数在派生类中没有被重写时,派生类中的虚表格中仍然存的是基类的虚函数的地址。当虚函数被调用时,就要到虚表格中取找函数地址。C++中的动态绑定机制主要就是通过虚表格来实现的。

当我们将基类的指针指向一个派生类的实体时,虚指针vptr就指向派生类的虚表格,这样就保证了派生类中的虚函数能被调用,参见如下代码:

class Shape {
public:
    int edge_len;
    virtual int circumference() {
        cout << "Circumference of Base Class\n";
        return 0;
    }
};
class Triangle: public Shape {
public:
    int circumference() {
        cout << "Circumference of Triangle Class\n";
        return 3 * edge_len;
    }
};
int main() {

    Shape *x = new Shape(); 
    x->circumference(); // "Circumference of Base Class"
    Shape *y = new Triangle();
    y->circumference(); // "Circumference of Triangle Class"
    
    return 0;
}

本文转自博客园Grandyang的博客,原文链接:虚函数[CareerCup] 13.3 Virtual Functions ,如需转载请自行联系原博主。

相关文章
|
编译器 C++
51 C++ - 抽象基类和纯虚函数(pure virtual function)
51 C++ - 抽象基类和纯虚函数(pure virtual function)
84 0
|
8月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
134 0
|
8月前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
92 0
|
5月前
|
编译器 C++
virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决
virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决
|
5月前
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
|
8月前
|
C语言 C++
关于内部函数(Static Functions)的文章
关于内部函数(Static Functions)的文章
57 1
|
8月前
|
编译器 Linux Shell
外部函数(External Functions)在C语言中的应用
外部函数(External Functions)在C语言中的应用
240 0
|
测试技术 C#
C#语法-虚方法详解 Virtual 虚函数
虚方法 / Virtual 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心...
1169 0
|
PHP 移动开发