zoukankan      html  css  js  c++  java
  • 虚函数与多态

    (很基础,本人菜鸟,大师勿喷,不过欢迎指正错误或补充)

    不解释,先上例子:

    class A

    {

    public:

       virtual void print ()=0;

       virtual void v_cname() { cout << "class A print by v_cname" << endl;}

       void cname() { cout << "class A print by cname" << endl;}

    };

    class B : public A

    {

    public:

       void print (){ cout << "class B , print " << endl;}

       void v_cname() { cout << "class B , v_cname" << endl;}

       void cname() { cout << "class B , cname" << endl;}

    };

    class C : public A

    {

    public:

       void print (){ cout << "class C , print " << endl;}

       void v_cname() { cout << "class C , v_cname" << endl;}

       void cname() { cout << "class C , cname" << endl;}

    };

    在main函数中执行:

       cout << "class B" << endl;

       A * a = new B();

       a->v_cname ();

       a->print();

       a->cname ();

       a = new C();

       cout << "class C" << endl;

       a->v_cname ();

       a->print();

       a->cname ();

    程序输出:

    class B

    class B , v_cname

    class B , print

    class A print by cname

    class C

    class C ,v_cname

    class C , print

    class A print by cname

    简单一句话:基类的指针指向派生类,若基类中有虚函数(包括纯虚和非纯虚函数),则调用所指向的派生类对应的函数。

    作用:一个基类指针指向不同的派生类时,可以调用不同派生类里面的函数(只要给函数在基类里面定义为虚函数)。(这就是传说中的“多态”???)

    这里又可以分两种情况:

    如果该函数是纯虚函数,那么必须在派生类中实现,调用的肯定是派生类里面的函数。

    如果该函数不是纯虚函数,那么派生类里面可以重新实现该函数,也可以不实现该函数。这时,则先去派生类中找是否有该函数的实现,有则调用,如果没有,则调用基类的函数。

    如上例中的类C定义改为:

    class C : public A

    {

    public:

       void print (){ cout << "class C , print " << endl;}

       //void v_cname() { cout << "class C , v_cname" << endl;}

       void cname() { cout << "class C , cname" << endl;}

    };

    同样执行main函数的代码,输出为:

    class B

    class B , v_cname

    class B , print

    class A print by cname

    class C

    class A print by v_cname

    class C , print

    class A print by cname

    说明:派生类C中v_cname函数没有实现,所以调用了基类A中的v_cname函数。

    关于虚函数:http://www.cnblogs.com/2007winter/archive/2012/04/19/2457190.html

  • 相关阅读:
    (转)Dockerfile安全介绍
    (转)浅析Docker运行安全
    (转)网络安全设备默认密码
    docker kali 相关初始化工作
    hibernate(结合springboot)入门
    idea 通过 Generate POJOs.groovy 生成实体类
    linux jdk 安装
    docker pstgres安装
    使用docker搭建FastDFS文件系统
    [docker]离线环境导入镜像
  • 原文地址:https://www.cnblogs.com/linkr/p/2602115.html
Copyright © 2011-2022 走看看