C++虚函数作用原理(二)——类的继承
上一篇博客
开始
上一篇博客我们了解了虚函数到底是怎么存在的,那么这一篇我们就要开始考虑:虚函数的继承问题了。
首先我们可以回忆一下,我们之前在学习继承的时候存在函数覆盖这个概念。如果没有函数覆盖,那么当我们调用子类中和父类同名函数时,就会出现二义性,编译器无法知道你到底需要哪一个函数。那么对于虚函数的继承我们是不是也应该考虑同名函数的覆盖问题呢?————当然应该,那么这里我们就来通过代码验证一下:
class A
{
int x;
int y;
public:
virtual void out()
{
cout << x << y << endl;
cout << "A" << endl;
}
virtual void out_1()
{
cout << x << y << endl;
}
};
class B :public A
{
void cout_1()
{
cout << "B"<<endl;
}
virtual void cout_4()//重写的一个虚函数
{
cout << "B1"<<endl;
}
};
int main()
{
A a;
B b;
return 0;
}
因为自己的学历有限可能会出现一些错误
##成员的分布:
![](https://img2018.cnblogs.com/blog/1784621/201911/1784621-20191112193103062-1815640229.png)
这个图中我们可以知道:
继承类B完全继承了A的所有成员,并且我们发现B只有虚函数表指针和A的虚函数表指针不一样,但是被B重写的函数<span style="color:red">void out()</span>的地址是与A的地址一样这就说明继承类把父类的虚函数覆盖了。这里就验证了虚函数覆盖这一说法!
<span style="color:red">备注:</span>这里我们也可以观察到B类单独写的虚函数
virtual void cout_4()//重写的一个虚函数
{
cout << "B1"<<endl;
}
并没有出现在虚函数表指针指向的表里面,它真的不在吗?当然不是,只是我们看不到而已。现在我们写一段代码来看看他到底在虚函数表里面吗?
int main()
{
A a;
B b;
cout << "继承来的函数——void out()的地址:" << (int)(int )&b << endl;
cout << "继承来的函数——void out_1()的地址:" << (((int)(int )&b)+1)<< endl;
cout << "B类自己的函数——void out_4()的地址:" << (((int)(int *)&b) + 2) << endl;
return 0;
}
####运行结果:
![](https://img2018.cnblogs.com/blog/1784621/201911/1784621-20191112194751331-2082567926.png)
这段代码运行的结果告诉我们其实,子类自己写的虚函数是在虚函数的表里面的只是没有显示出来。