0x01
多态是c++的灵魂之处,c++实现多态就是使用vptr指针,实现多态的三个条件,
1. virtual 关键字
2. 子类重写父类的虚函数
3. 父类指针调用子类对象虚函数
0x02 vptr的存储问题 —vptr是属于类的,而不是属于对象的
直接附上代码 —>发现vptr是存储在父类中
class A {
virtual void func() {
cout << "A's func is called" << endl;
}
public:
int d = 12;
};
class B :public A {
virtual void func() {
cout << "B's func is called" << endl;
}
private:
int b = 1222;
};
void main()
{
A c1;
B c2;
A tmp = c2;
}
0x03 关于 *(void**)&a
当a是一个对象时 输出的是vptr指针的地址,*(void**)&a 可以简单的看作把 &a 指向的内存空间的内容转换为 void*。由于vptr指针的类型为 void ** 所以需要写成这样才可以打印。
class A {
virtual void func() {
cout << "A's func is called" << endl;
}
public:
int d = 12;
};
void main()
{
A a, b, *p, **n;
p = &a; //指向地址a
n = &p; //指向指针 p的地址
cout << *(void **)&a << endl;
cout << *(void **)&a << endl;
cout << *(void **)&p << endl;
cout << *(void **)n << endl;
cout << &p << endl; //取得指针P的地址
cout << n << endl; //取得N指向的指针地址即P的地址
}