CODE大全
您的位置 : 首页 > JAVA开发 >

c++ 多态

发布时间:『 2018-05-07

网上关于C++的文章没有 java 的多,这和 java 大多数框架都开源的关系密切相关。今天为大家分享一篇C++ 面向对象 多态的文章!

什么是多态

学过java的人,我想这对他一定不陌生。

多态:字面意思就是多种形态。在面向对象语言中,接口的多种不同实现方式即为多态! 
在c++中也是如此,同一操作作用于不同的对象可以有不同的解释,有不同的结果。在运行时可以通过指向基类的指针,来调用实现派生类中的方法。 

在c++中实现多态的方法:虚函数,抽象类,覆盖,模板(注意:重载和多态无关!)

对象类型

C++ 对象类型

看下面的例子:

C++ 静态类型

静态分类:静态多态(函数重载,泛型编程);动态多态(虚函数) 。

静态多态

int add(int left, int righthttp://www.bdx-leb.com/505d/8921d0b50433.html)
{
    return left + right;
}
float add(float left, float right)
{
    return left + right;
}

int main()
{
    cout << add(1, 2) << endl;
    cout << add(1.1f, 2.2f) << endl;
    system("pause");
    return 0;
}

动态多态

看下么的例子:

class CWashRoom
{
public:
    void GotoManWashRoom()
    {
        cout << "Man---->please left&quohttp://www.bdx-leb.com/d89e/0cd7fa2a2dea.htmlt; << endl;
http://www.bdx-leb.com/dc2f/13dd2430babf.html    }
    void GotoWomanWashRoom()
    {
        cout << "Woman--->please right" << endl;
    }
};
class Person
http://www.bdx-leb.com/864b/43e6a85653b2.html{
public:
    virtual void GotoWashRoom(CWashRoom&_washroom) = 0;
};

class man :public Person
{
public:
    virtual void GotoWashRoom(CWashRoom&_washroom)
    {
        _washroom.GotoManWashRoom();
    }
};
class woman :public Person
{
public:
    virtual void GotoWashRoom(CWashRoom&_washroom)
    {
        _washroom.GotoWomanWashRoom();
    }
};

void test()
{
    CWashRoom washroom;//创建CWashRoom类的对象washroomhttp://www.bdx-leb.com/c798/13d276a68b62.html
    int i = 0;
    for (i = 1; i <= 10; ++i)
    {
        Person* pperson;//创建person类指针,实现基类方法的调用
        int iper = rand() % i;
        if (iper & 0x01)
        {
            pperson = new man;
        }
        else
        {
            pperson = new woman;
        }
 http://www.bdx-leb.com/1bdf/5ca365f04ea4.html       ppersohttp://www.bdx-leb.com/0b65/302ea013214d.htmln->GotoWashRoom(washroom);
        delete pperson;
        pperson = NULL;
        Sleep(1000);
    }
}
int main()
{
    test();
    system("pause");http://www.bdx-leb.com/d7d3/703b18b811b2.html
    return 0;
}

这里面涉及到重写。

C++ 面向对象 重写

virtual:关键字修饰类成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将会实现动态绑定。

动态绑定的条件:

必须是虚函数  通过基类类型的引用或者指针调用虚函数

继承体系中同名函数的关系

C++ 面向对象 继承

总结

在继承的结构下,基类必须要有有虚函数,派生类中必须要对基类的虚函数进行重写,通过基类的指针或者引用访问。  构造函数不能作为虚函数。(1,因为创建对象时我们总要明确指定对象的类型,而虚函数实在程序运行期间确定实际类型的。当对象没有构造成功时,编译器无法知道对象实际类型是该类本身还是该类的派生类,或者更深层次的派生类。2,虚函数的执行依赖于虚函数表。而虚函数表实在构造函数中进行初始化工作的。构造对象时,虚函数表还没有被初始化http://www.bdx-leb.com/4f50/bd49c920fcbf.html。)  静态成员函数不能作为虚函数。http://www.bdx-leb.com/3d0c/61478ddff4d1.html(静态成员函数没有this指针)  赋值运算符不建议作为虚函数。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!


——— 全文完 ———
上一篇:没有了 下一篇:没有了
Powered by 张鑫旭 | 鄂ICP备14009759号-2 | 网站留言 Copyright © 2014-2016 张鑫旭 版权所有