如有错误,请留言批评
目录
老六:一
看看这题我们func1重写后a等于0?????bb的调用a又等于0了。
画个图就理解了
多态调用:
普通调用
对了还有个很勾的。
对象a的fun1调用,其实我们的原生函数都没有被修改而是我们的多态调用,采用虚表寻址,函数调用的地址都去虚表中找。导致了好像函数被修改重写的假象。
老六:二
class A
{
public:
A()
{
test();
}
virtual void func1()
{
cout << "A::func1()" << endl;
}
void test()
{
func1();
}
};
class B : public A
{
public:
B()
{
test();
}
virtual void func1()
{
cout << "B::func1()" << endl;
}
};
int main()
{
B bb;
return 0;
}
符合多态调用规则,应该打印2个B::func1(),但是
实际我们的打印了A::func1 和B::func1这是什么原因?
B类实例化时,是先调用父类A的构造函数,执行test()函数,在调用func()函数,由于此时还处于对象构造阶段,多态机制(B类的虚表指针还未生成)还没有生效,所以,此时执行的func函数为父类的func函数。
构造完父类后,再去执行子类构造函数此刻子类虚表指针(在初始化列表阶段)已经生成,又调用test函数,然后又执行func(),由于父类已经构造完毕,子类虚表指针又已经生成,func满足多态的条件,所以调用子类的func函数。
如有错误,请留言批评