C++学习 2018-11-27
1.多态
1.什么是多态?
父类的指针 指向一个子类对象,通过父类的指针调用实际子类的成员函数,使父类的指针有多种形态。
2.多态基于什么实现?
多态基于虚函数实现,虚函数要基于重写。
3.虚函数实现多态的原理?
通过函数指针组成的虚函数列表(v_Table),还需要一个记录表头指针(vfptr);
当调用一个虚函数的时候,通过vfptr找到v_Table中的对应的函数指针调用;
虚函数列表(v_Table),是一个全局的编译存在,每个类只有一份;
记录表头指针(vfptr),是类中的一个成员,每个对象有一份,创建对象的时候存在,在构造函数中初始化,指向对应的列表。
4.多态的缺点与优点
1.优点:复用和扩展
2.缺点:效率,空间,安全性
5.进一步解释多态性质
看调用的函数,在当前这个指针的类型那个类中是不是虚函数?
是虚函数----->对象的列表中装谁的就调用谁的;
不是虚函数----->和对象没有关系,调用当前这个指针的类型那个类
6.例子
class CFather
{
public:
virtual void AA()
{
cout << "CFather::AA()" << endl;
}
virtual void BB()
{
cout << "CFather::BB()" << endl;
}
void CC()
{
cout << "CFather::CC()" << endl;
}
};
class CSon:public CFather
{
public:
virtual void AA()
{
cout << "CSon::AA()" << endl;
}
void CC()
{
cout << "CSon::CC()" << endl;
}
virtual void DD()
{
cout << "CSon::DD()" << endl;
}
};
int main()
{
CFather *p1 = new CFather;
p1->AA();
p1->BB();
p1->CC();
CFather *p2 = new CSon;
p2->AA();
p2->BB();
p2->CC();
// p2->DD(); // 无法调用,因为不是CFather中的方法,
system("pause");
return 0;
}