虚函数的调用指令
为什么在构造函数比成员函数里调用虚函数的汇编指令更少,在类外调用虚函数的汇编指令和在构造函数里一样?
具体的代码如下:
class Text
{
public:
Text()
{
F();
//汇编指令:
//004115FC mov ecx,dword ptr [this]
//004115FF call Text::F (41128Ah)
}
virtual void F()
{}
void T()
{
F();
//00411693 mov eax,dword ptr [this]
//00411696 mov edx,dword ptr [eax]
//00411698 mov esi,esp
//0041169A mov ecx,dword ptr [this]
//0041169D mov eax,dword ptr [edx]
//0041169F call eax
//004116A1 cmp esi,esp
//004116A3 call @ILT+450(__RTC_CheckEsp) (4111C7h)
}
};
int main()
{
Text t;
//0041153E lea ecx,[t]
//00411541 call Text::Text (4110CDh)
t.F();
//00411546 lea ecx,[t]
//00411549 call Text::F (41128Ah)
t.T();
//0041154E lea ecx,[t]
//00411551 call Text::T (41104Bh)
}
请知道的朋友解释下
[解决办法]
构造函数里不会调用虚函数的。
因为构造函数只负责本类成员的构造,它不知道而且应该不管子类是怎样的。
[解决办法]
虚函数请用指针调用.
Text *t=NULL;
t=new Text();
t-> f
[解决办法]
只有使用指针的时候才能体现多态
[解决办法]
继承类的构造顺序是父类---> 子类,要是在构造函数中可以调用虚函数,那么如果父类中调用了父类的某个虚函数,此时这个虚函数指向子类里相应的函数,可是此时子类都没初始化好,其方法就被调用了,这就要出问题了。
[解决办法]
上面漏了几个关键的几个字
父类的构造函数中
继承类的构造顺序是父类---> 子类,要是在构造函数中可以调用虚函数,那么如果在父类的构造函数中调用了父类的某个虚函数,此时这个虚函数指向子类里相应的函数,可是此时子类都没初始化好,其方法就被调用了,这就要出问题了。