结论:
定义一个父类对象,将该父类对象的指针强制类型转换为子类指针,并赋给一个子类指针,则:该子类指针将指向该父类对象,但是其this指针仍然是指向子类的指针。
当该指针调用虚成员函数时,将按照对象的内存布局(指向虚函数表的指针存储在该对象的前四个字节)调用父类虚成员函数。
当该指针调用普通成员函数时,将通过this指针调用位于代码段的该子类的成员函数。
例1、非虚成员函数
typedef void(*fun)(void);
class Base
{
public:
Base(int i):a(i){}
void fun() {cout << "Base's funciton" <<endl;}
void this_fun(Base *b)
{
if (b == this)
cout << "it is Base's this" <<endl;
}
private:
int a;
};
class Derived: public Base
{
public:
Derived():Base(2),d(0){}
void fun() { cout << "Derived's function" <<endl;}
void this_fun(Derived *d)
{
if (d == this)
cout << "it is Derived's this" <<endl;
}
private:
int d;
};
int main()
{
Base b(1);
Derived *d=(Derived*) &b;
(*d).this_fun(d);
cout << *((int *)d) <<endl; //指向对象的成员变量,由成员变量值判断指向的是哪个对象
d->fun();
system("pause");
return 0;
}
输出:
由输出"it is Derived's this"可以判断:d仍为指向子类的指针。
由输出“1“可以判断:d指向的对象仍为父类对象b。
例2、虚成员函数
typedef void(*Fun)(void);
class Base
{
public:
Base(int i):a(i){}
virtual void fun() {cout << "Base's funciton" <<endl;}
void this_fun(Base *b)
{
if (b == this)
cout << "it is Base's this" <<endl;
}
private:
int a;
};
class Derived: public Base
{
public:
Derived():Base(2),d(0){}
void fun() { cout << "Derived's function" <<endl;}
void this_fun(Derived *d)
{
if (d == this)
cout << "it is Derived's this" <<endl;
}
private:
int d;
};
int main()
{
Base b(1);
Derived *d=(Derived*) &b;
(*d).this_fun(d);
Fun f1=(Fun)*(int*)*(int *)d;
f1(); //指向虚函数表的第一个函数
cout << *((int *)d+1) <<endl; //指向对象的成员变量,由成员变量值判断指向的是哪个对象
d->fun();
system("pause");
return 0;
}
输出
由输出"it is Derived's this"可以判断:d仍为指向子类的指针。
由输出" Base's funciton"可以判断:f1指向父类虚函数表的第一个函数,d指向的对象仍为父类对象b5。
由输出“1“可以判断:d指向的对象仍为父类对象b。