1.多态
多态,按字面意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。多态性是允许你将一个父类对象设置成为一个或更多个子对象相等的技术,赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作,即当使用基类的指针或者引用调用重写的虚函数时,当指向父类调用的就是父类的虚函数,指向子类调用的就是子类的虚函数。多态是通过虚函数实现的。
举例说明:
class Base
{
public:
virtual void fun()
{
cout<<"Base::virtual void fun()"<<endl;
}
};
class AA : public Base
{
public:
virtual void fun()
{
cout<<"AA::virtual void fun()"<<endl;
}
};
void Fun(Base& b)
{
b.fun();
}
int main()
{
Base b;
AA a;
Fun(b);
Fun(a);
system("pause");
return 0;
}
2.虚表
虚表,全称为虚拟函数表,是从属于类的。
在C++语言中,每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚拟函数表(简称虚表),表中的每一个元素都指向一个虚函数的地址。虚表解决了继承、虚函数(重写)的问题,保证其内容真实反映实际的函数。此外,编译器会为包含虚函数的类加上一个成员变量,是一个指向该虚函数表的指针(常被称为vfptr),每个由此类别派生出来的类,都有一个vfptr。虚表指针是从属于对象的,也就是说,如果一个类含有虚表,则该类的所有对象都会含有一个虚表指针,并且该虚表指针指向同一个虚表。
举例说明:
class Base
{
public:
virtual void fun1()
{
cout<<"virtual void fun1()"<<endl;
}
virtual void fun2()
{
cout<<"virtual void fun2()"<<endl;
}
protected:
int _b;
};
int main()
{
Base b;
system("pause");
return 0;
}
其中可以看出,虚表的内容是依据类中的虚函数声明次序填入函数指针。