C++虚函数见解

虚函数是C++实现多态的重要一环,彻底弄懂它是非常有必要的。

其中有两点需要注意。

一、虚函数表

如果你之前对虚函数(表)的实现机制没有什么了解的话,可以访问这个博客。https://blog.twofei.com/496/

我简单的总结一下虚函数(表)的实现机制。

1、如果没有在需要重载和函数前面加virtual,那便不能实现多态。继承类的函数在编译时被静态绑定到基类的相关函数。

2、有虚函数的类会维持一份虚函数表。这个虚函数表是一个函数指针,存储着虚函数的地址。那么这意味着两点:(1)、无论有多少虚函数,类的大小只会增加4字节(sizeof(void*)==4)(2)、类的不同实例都是指向一个虚函数表地址。

3、继承类的新虚函数会依附在第一个继承的基类的虚函数表上,没有覆盖基类的虚函数表。

二、类的声明和定义

先来看一段代码 

class Base1 {
public:

    int base1_1;
    int base1_2;

    virtual void base1_fun1() { cout << "base1_fun1()" << endl; }
    virtual void base1_fun2() { cout << "base1_fun2()" << endl; }
};

class Derive1 : public Base1
{
public:
    int derive1_1;
    int derive1_2;

    // 覆盖基类函数
    virtual void base1_fun1() { cout << "base1_fun1() is changed by derive1" << endl; }
    virtual void Derive1() { cout << "Derivel()" << endl; }
};  

int main() {
    Base1* b1 = new Base1;  
    Derive1* d1 = new Derive1; 
    Base1* b1d = (Base1*)new Derive1; 
    //Derive1 db1 = (Derive1*)new Base1; 报错 
    b1->base1_fun1();  
    d1->base1_fun1();  
    b1d->base1_fun1();
    //b1d->Derivel() 报错
}

 

是不是对 Base1* b1d = (Base1*)new Derive1; 感到很疑惑。我们来看一下运行结果:

C++虚函数见解

由此,我们可以知道,当以继承类大小申请内存空间,但是内存空间却被基类指针指向时,这个指针其实是阉割版继承类。阉割了什么呢?把除了基类相关的一切都阉割了。但是要注意一点基类的虚函数还是被覆盖了。

原文链接: https://www.cnblogs.com/guanzhanyi/p/12937300.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++虚函数见解

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350094

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:05
下一篇 2023年3月2日 上午6:05

相关推荐