1、只有一个直接基类
1) 派生类和基类会共用一个虚函数表。
2) 如果基类中的虚函数被覆盖,那么原本基类虚函数的位置会被覆盖它的派生类的虚函数替代。
3) 派生类中未覆盖基类中成员函数的虚函数也会被放进虚函数表中,接在基类后面,虽然不能被基类指针调用。
2、有多个直接基类
1) 有几个直接基类,就有几个虚函数表。
2) 如果基类中的虚函数被覆盖,那么原本基类虚函数的位置会被覆盖它的派生类的虚函数替代。
3) 派生类中未覆盖基类中成员函数的虚函数会被放入第一个虚函数表中,接在基类后面。
*C++ 子类覆盖了父类的虚函数后,为什么还可以引用父类的函数?
-
class A
-
{
-
public:
-
virtual void func(){ cout<<"A"<<endl; }
-
}
-
class B : public A
-
{
-
public:
-
virtual void func(){ cout<<"B"<<endl; }
-
}
-
B b;
-
b.A::func();
输出为: A
问:B继承了A之后并且重写了 A 的方法 ,A 的func函数被覆盖了 ,那编译器是怎么找到A 的func函数并输出"A" 的?B的虚函数表中,func()不是被替换了吗?
答:虚函数是指这个函数的签名。
而 这个虚函数在类中的实现不是,它是一个实实在在的成员函数。
和普通的函数一样的。
如果这个函数是虚函数,此时编译器会把其地址放在虚函数表中。不是虚函数不会放入虚函数表中。
所以这个函数有两个入口。
第一个就是你这样呼叫,和普通的成员函数一致。
第二个是通过引用呼叫,此时编译器会通过虚表来呼叫。
此时需要添加一个修正 this 指针的转换函数。
标签:基类,函数,覆盖,表中,func,派生类,重点 来源: https://blog.csdn.net/shuaifeng_/article/details/120371664
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。