#include<iostream>
#include<typeinfo>
using namespace std;
class A {
public:
A() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "----------------------" << endl;
}
int a;
};
class B:public A {
public:
B() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl;
cout << "----------------------" << endl;
}
int b;
};
class C :public B {
public:
C() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl;
cout << "&c = " << &c << endl;
cout << "----------------------" << endl;
}
int c;
};
int main() {
A *pa = new C;
delete pa;
system("pause");
return 0;
}
输出结果:
可以看到A B C 的this指针的地址都是相同的(与成员变量a的地址相同),但类型是不同的。
如果A是抽象类呢:
#include<iostream>
#include<typeinfo>
using namespace std;
class A {
public:
A() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "----------------------" << endl;
}
virtual void fun() = 0;
int a;
};
class B:public A {
public:
B() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl;
cout << "----------------------" << endl;
}
void fun() {}
int b;
};
class C :public B {
public:
C() {
cout << this << endl;
cout << typeid(this).name() << endl;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl;
cout << "&c = " << &c << endl;
cout << "----------------------" << endl;
}
int c;
};
int main() {
A *pa = new C;
delete pa;
system("pause");
return 0;
}
输出结果:
可以看到A B C 的this指针的地址都是相同的,但这里不再等于成员变量a的地址,应该是多了一个虚函数指针,偏移了4个字节,所以成员变量a的地址在this指针的基础上又加了4个字节,同样类型不相同。