栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++:多态的自我理解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++:多态的自我理解

一.多态的初识

静态函数     函数重载
动态函数     继承和虚函数
1.什么是多态
       通过父类的指针调用实际的子类成员函数,使父类指针有多种形态
2.多态基于什么实现
       基于虚函数实现,虚函数要在子类中重写

注意:构造函数不能为虚函数
3构成多态的条件
->>>>必须有继承
->>>>必须有同名虚函数
->>>>父类指向子类(引用或指针)  并通过父类调用虚函数

4.虚函数的实现原理

重写:父类虚函数在子类中重新实现

覆盖:如果子类中有父类虚函数的重写  就会覆盖子类的虚函数列表

       通过函数指针,所有的虚函数的指针组成了一个虚函数列表(vTable)
       需要一个记录当前对象使用的是哪个虚函数列表的虚指针(vfptr),虚指针包含着当前对象的前四个字节中
       当通过父类指针调用子类函数时,就会通过vfptr找到当前的虚函数列表,通过虚函数列表中的函数指针调用
       在子类中重写虚函数就会覆盖虚函数列表中的内容(虚函数列表中的函数指针由父类变成子类)
vTable:虚函数列表(函数指针数组),在编译期存在,所有的这个类共享一个虚函数列表
vfptr: 虚指针(二级函数指针),用来指向当前对象所使用的虚函数列表

5.优缺点:
        优点:提高复用性和拓展性
        缺点:安全性、空间、效率

下面请看实例

//#include 
//using namespace std;

//class Drink
//{
//public:
//    virtual void Show()  
//    {
//        cout << "Drink" << endl;
//    }
//};
//class Milk:public Drink  
//{
//public:
//    void Show()
//    {
//        cout << "Milk" << endl;
//    }
//};
//class Coffee :public Drink
//{
//public:
//    void Show()
//    {
//        cout << "Coffee" << endl;
//    }
//};
//class Water :public Drink
//{
//public:
//    void Show()
//    {
//        cout << "Water" << endl;
//    }
//};
void Glass(Milk& rm)
{
    rm.Show();
}
void Glass(Coffee& rc)
{
    rc.Show();
}
void Glass(Water& rw)
{
    rw.Show();
}
//void Glass(Drink &rd)        
//{
//    rd.Show();
//}
//void Glass(Drink* pd)
//{
//    pd->Show();
//}
//int main()
//{
//    Milk m;
//    Coffee c;
//    Water w;
//
//    Glass(c);
//    Glass(w);
//    Glass(m);
//    cout << "--------------------" << endl;
//    Glass(&c);
//    Glass(&w);
//    Glass(&m);
//    system("pause");
//    return 0;
//}


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008904.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号