#include<iostream>
using namespace std;
class NT {
public:
NT(){
cout<<"NT Constructor "<<endl;
}
virtual void OnInit(){
cout<<"NT Init"<<endl;
}
int test(){
OnInit();//由于为virtual函数,所以此处执行的是BRID的OnInit方法,而不是NT的
cout<<"NT test"<<endl;
return 1;
}
};
class BRID : public NT {
public:
BRID():NT(){
cout<<"BRID Constructor"<<endl;
}
virtual void OnInit(){
cout<<"BRID Init"<<endl;
}
};
int main(){
BRID b;
b.test();//由于BRID没有test方法,所以调用NT的test方法
}
执行结果为
NT Constructor
BRID Constructor
BRID Init
NT test当BRID没有重写OnInit方法时,会调用NT的OnInit方法,即使有NT的子类重写了OnInit方法
#include<iostream>
using namespace std;
class NT {
public:
NT(){
cout<<"NT Constructor "<<endl;
}
virtual void OnInit(){
cout<<"NT Init"<<endl;
}
int test(){
OnInit(); //虽然为virtual函数,但BRID没有重写OnInit方法,
//虽然BRID2有OnInit方法,但编译器不会调用BRID2的,
//而是调用NT的OnInit方法
cout<<"NT test"<<endl;
return 1;
}
};
class BRID : public NT {
public:
BRID():NT(){
cout<<"BRID Constructor"<<endl;
}
/*virtual void OnInit(){
cout<<"BRID Init"<<endl;
}*/
};
class BRID2 : public NT {
public:
BRID2():NT(){
cout<<"BRID2 Constructor"<<endl;
}
virtual void OnInit(){
cout<<"BRID2 Init"<<endl;
}
};
int main(){
BRID b;
b.test();//由于BRID没有test方法,所以调用NT的test方法
}运行结果:
NT Constructor
BRID Constructor
NT Init
NT test
C++虚函数表调用解析
本文通过两个示例详细解析了C++中虚函数的调用机制,特别是虚函数表的工作原理。展示了如何通过继承和虚函数实现多态,并讨论了在不同情况下虚函数调用的行为差异。

被折叠的 条评论
为什么被折叠?



