看下面这个例子
#include <iostream>
class Base {
public:
virtual void vshow() {std::cout << "base vshow" << std::endl;}
void show() {this->vshow();}
};
class Sub : public Base {
public:
void vshow() override {std::cout << "sub vshow" << std::endl;}
};
int main() {
Base* x = new Sub();
x->show();
return 0;
}
输出:
sub vshow
可以知道调用show()
时Base
里面的this
指针指向了实例 x;
对象构造完成后虚函数指针已经初始化好了
再看下面例子
#include <iostream>
class Base
{
public:
Base()
{
this->vshow();
}
virtual void vshow()
{
std::cout << "base vshow" << std::endl;
}
};
class Sub :public Base
{
public:
Sub() {}
void vshow() override
{
std::cout << "sub vshow" << std::endl;
}
};
int main()
{
Base* x = new Sub();
return 0;
}
输出:
base vshow
可以知道在父类构造时,this
指针还指向着父类实例,父类构造完成时及之前,虚函数指针还未初始化成功
观察下面例子:
#include <iostream>
class Base
{
public:
virtual void vshow()
{
std::cout << "base vshow" << std::endl;
}
};
class SubProxy : public Base
{
public:
SubProxy(Base* p)
{
p->vshow();
};
};
class Sub :public Base
{
SubProxy proxy;
public:
Sub() : proxy {this} {}
void vshow() override
{
std::cout << "sub vshow" << std::endl;
}
};
int main()
{
Base* x = new Sub();
return 0;
}
输出:
sub vshow
现在可以得出结论:
C++虚函数指针初始化时间是在父类构造完成之后,本类初始化列表之前完成的。