虚实函数相互调用和函数重写覆盖的一些心得
2008-11-01 23:51
253 查看
注:标题中所说的实函数是指普通成员函数
A为基类,继承关系如图
A
|
B
|
C
|
D
伪代码如下:
B *pb = new C;
pb->f1();
总结:
1.调用从基类继承来的成员函数,在子类中未有重写覆盖(overriding),函数内部的this指针为基类类型
2.调用虚函数,当有重写覆盖时,虚函数内部保存的指针为子类类型,当未有重写覆盖上时规则同上
3.调用普通成员函数时,this指针可能上升(从子类转为基类)
4.调用虚函数时,this指针可能上升也可能下降(从基类转为子类),但是不会下降到子类实体对象以下
测试代码如下:
#include <iostream.h>
//--------------------------------------------------------------------------------
class A
{
public:
void f1(){
cout<<"A::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"A::f2()"<<endl;
f3();
}
void f3(){
cout<<"A::f3()"<<endl;
f4();
}
void f4(){
cout<<"A::f4()"<<endl;
}
};
//--------------------------------------------------------------------------------
class B: public A
{
public:
/*
void f1(){
cout<<"B::f1()"<<endl;
f2();
}
*/
virtual void f2(){
cout<<"B::f2()"<<endl;
f3();
}
void f3(){
cout<<"B::f3()"<<endl;
f4();
}
};
//--------------------------------------------------------------------------------
class C: public B
{
public:
void f1(){
cout<<"C::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"C::f2()"<<endl;
f3();
}
/*
void f3(){
cout<<"C::f3()"<<endl;
f4();
}
*/
void f4(){
cout<<"C::f4()"<<endl;
}
};
//--------------------------------------------------------------------------------
class D: public C
{
public:
void f1(){
cout<<"D::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"D::f2()"<<endl;
f3();
}
void f3(){
cout<<"D::f3()"<<endl;
}
};
//--------------------------------------------------------------------------------
int main(void)
{
B *pb = new C;
pb->f1();
return 0;
}
A为基类,继承关系如图
A
|
B
|
C
|
D
伪代码如下:
B *pb = new C;
pb->f1();
总结:
1.调用从基类继承来的成员函数,在子类中未有重写覆盖(overriding),函数内部的this指针为基类类型
2.调用虚函数,当有重写覆盖时,虚函数内部保存的指针为子类类型,当未有重写覆盖上时规则同上
3.调用普通成员函数时,this指针可能上升(从子类转为基类)
4.调用虚函数时,this指针可能上升也可能下降(从基类转为子类),但是不会下降到子类实体对象以下
测试代码如下:
#include <iostream.h>
//--------------------------------------------------------------------------------
class A
{
public:
void f1(){
cout<<"A::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"A::f2()"<<endl;
f3();
}
void f3(){
cout<<"A::f3()"<<endl;
f4();
}
void f4(){
cout<<"A::f4()"<<endl;
}
};
//--------------------------------------------------------------------------------
class B: public A
{
public:
/*
void f1(){
cout<<"B::f1()"<<endl;
f2();
}
*/
virtual void f2(){
cout<<"B::f2()"<<endl;
f3();
}
void f3(){
cout<<"B::f3()"<<endl;
f4();
}
};
//--------------------------------------------------------------------------------
class C: public B
{
public:
void f1(){
cout<<"C::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"C::f2()"<<endl;
f3();
}
/*
void f3(){
cout<<"C::f3()"<<endl;
f4();
}
*/
void f4(){
cout<<"C::f4()"<<endl;
}
};
//--------------------------------------------------------------------------------
class D: public C
{
public:
void f1(){
cout<<"D::f1()"<<endl;
f2();
}
virtual void f2(){
cout<<"D::f2()"<<endl;
f3();
}
void f3(){
cout<<"D::f3()"<<endl;
}
};
//--------------------------------------------------------------------------------
int main(void)
{
B *pb = new C;
pb->f1();
return 0;
}
相关文章推荐
- 关于函数调用的一些心得
- MapXtreme 2005 学习心得 一些基础函数代码(四)
- AS与JS相互通信(Flex中调用js函数)
- 基类虚函数重写调用问题
- python 函数调用时传递参数的一些规范
- C语言函数和汇编函数相互调用(转)
- java与C函数相互调用整理
- cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用
- iframe 和 父页面 相互取值及函数调用
- asp.net 与 JavaScript 的函数相互调用
- 类成员函数的重载、重写、和覆盖区别
- 关于pthread里面一些函数的使用心得!
- 关于pthread里面一些函数的使用心得!
- extern C(C++与C实现相互函数的调用)
- 重写 等待框 show() 函数,定位那里调用了该函数
- C++子类调用父类覆盖的函数
- 一些工具函数--object 于 DataTable 相互转换
- 深析静态链接库和动态链接库相同函数覆盖及库调用顺序问题
- X64 函数调用的一些问题
- js函数在frame中的相互调用详解