C++多态实现效果
多态:同样的调用语句有多种不同的表现形态;接口的多种不同的实现方式。
多态实现的三个条件
有继承、有virtual重写、有父类指针(引用)指向子类对象。
多态的C++实现
virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用
多态的理论基础
动态联编(编译时不确定到底调用的是基类还是派生类的函数,运行时才确定)。根据实际的对象类型来判断重写函数的调用。
多态的重要意义
设计模式的基础。
实现多态的理论基础
函数指针做函数参数。
C++中多态的实现原理
每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,虚函数表中列出了该类的虚函数地址,每个对象(注意这里是对象)中都有一个指向虚函数表的指针(vptr指针)。多出来的4个字节就是用来放虚函数表的地址的。
看下面程序:
#include<iostream>
using namespace std;
class Parent
{
private:
int m_a;
public:
Parent(int a = 0)
{
this->m_a = a;
}
~Parent()
{
}
virtual void print()//virtual关键字
{
cout<<"parent"<<endl;
}
};
class Child:public Parent
{
private:
int m_c;
public:
Child(int c = 0)
{
this->m_c = c;
}
~Child()
{
}
virtual void print()//继承并实现函数的重写
{
cout<<"Child"<<endl;
}
};
void main()
{
Parent *p_a;
Child c_a;
p_a = &c_a;
p_a->print();// 多态的体现
cout<<"parent"<<sizeof(Parent)<<endl;
cout<<"child"<<sizeof(Child)<<endl;
system("pause");
}
其运行结果是:至于sizeof(Parent)结果为什么是8?一个int 型变量4个字节外加vtpr 指针4个字节(虚函数表是由编译器自动生成与维护的)(类的成员函数和类的对象是分开存储的)。
构造函数中能调用虚函数,实现多态吗?
对象在创建的时,由编译器对VPTR指针进行初始化
只有当对象的构造完全结束后VPTR的指向才最终确定
父类对象的VPTR指向父类虚函数表
子类对象的VPTR指向子类虚函数表
因此,在造函数中调用多态函数,不能实现多态。