多态
多态是面向对象程序设计的重要特征之一,在C++中多态可以这样定义:同一操作作用于不同类的实例,将产生不同的执行结果。也就是说,不同的类的对象收到相同的消息时,得到不同的结果。
【**多态的对象模型】–单继承&多继承
虚表剖析
虚表是通过一块连续内存来存储虚函数的地址。
单继承
首先我们先写一个可以打印虚表的函数
//该函数只能在32位平台下打印虚表
typedef void(*V_FUNC)(); //定义一个无参返回值为空的函数指针V_FUN
void PrintVtable(int* vtable)
{
int* vArray =(int*) vtable;
printf("vtable:0x%p\n", vArray);
for (size_t i = 0; vArray[i] != 0; i++)
//在vs下虚表结束的标志是=0
{
printf("vtable[%d]:.0x%x->", i, vArray[i]);
V_FUNC f = (V_FUNC)vArray[i];
f();
}
cout << endl;
}
下面函数在32位/64位平台都适用
typedef void(*V_FUNC)();
void PrintVtable(void* vtable)
{
printf("vtable:0x%p\n", vtable);
V_FUNC* vArray =(V_FUNC*) vtable;
for (size_t i = 0; vArray[i] != 0; i++)
{
printf("vtable[%d]:.0x%x->", i, vArray[i]);
vArray[i]();
}
cout << endl;
}
多继承
多态的对象模型–菱形继承和菱形虚拟继承
菱形继承
class A
{
public:
virtual void fun1()
{
cout << "A::fun1()" << endl;
}
virtual void fun2()
{
cout << "A::fun2()" << endl;
}
public:
int _a;
};
class B:public A
{
public:
virtual void fun1()
{
cout << "B::fun1()" << endl;
}
virtual void fun3()
{
cout << "B::fun3()" << endl;
}
public:
int _b;
};
class C:public A
{
public:
virtual void fun1()
{
cout << "C::fun1()" << endl;
}
virtual void fun3()
{
cout << "C::fun3()" << endl;
}
public:
int _c;
};
class D :public B,public C
{
public:
virtual void fun1()
{
cout << "C::fun1()" << endl;
}
virtual void fun5()
{
cout << "C::fun4()" << endl;
}
public:
int _d;
};
菱形虚继承
class A
{
public:
virtual void fun1()
{
cout << "A::fun1()" << endl;
}
virtual void fun2()
{
cout << "A::fun2()" << endl;
}
public:
int _a;
};
class B:virtual public A
{
public:
virtual void fun1()
{
cout << "B::fun1()" << endl;
}
virtual void fun3()
{
cout << "B::fun3()" << endl;
}
public:
int _b;
};
class C:virtual public A
{
public:
virtual void fun1()
{
cout << "C::fun1()" << endl;
}
virtual void fun3()
{
cout << "C::fun3()" << endl;
}
public:
int _c;
};
class D : public B, public C
{
public:
virtual void fun1()
{
cout << "C::fun1()" << endl;
}
virtual void fun5()
{
cout << "C::fun4()" << endl;
}
public:
int _d;
};