• C++学习总结3


    链接上一篇日志,C++学习总结2,下面介绍下C++里面的其他内容

    虚函数:一个接口,多种方法。
    多态:编译时的多态与运行时的多态。
    编译时的多态表现为运算符的重载与函数的重载。
    运行时的多态表现为使用派生类与虚函数。
    虚函数需要使用关键字virtual。  指向派生类型的指针。
    基类型指针与派生类指针 .基类指针可以指向任何派生类的对象。
    a_class *p;
    a_class a_obj;
    b_class b_obj;
    p = &a_obj;
    p = &b_ obj; //这个是引用
    注:它可以指向派生类型的对象,但不能够访问派生类对象中定义的成员。
    #include<iostream>

    using namespace std;

    class a_class

    {

    public:

       virtual void vf()

      {

         cout << "这是一个基类型的函数" <<endl;

      }

    };

    class b_class:public a_class

    {

      public:

       void vf()

    {

        cout << "这是第一个派生类的函数"<<endl;

    }

    };

    class c_class : public a_class

    {

      public:

      void vf()

       {

          cout << "这是第二个派生类的函数"<<endl;

       }

    };

    int main()

    {

       a_class *p;

       a_class a_obj;

       b_class b_obj;

       c_class c_obj;

       p = &a_obj;

       p->vf(); //没有p.vf()之说,*p.vf/()也不对,返回的是vf是一个指针量。

       p = &b_obj;

       (*p).vf();

       p = &c_obj;

       (*p).vf();

       return 0;

    }
    当然我们也可以用引用来调用虚函数。上面是通过基类指针来调用虚函数。
    有啥意义??一个现在的函数先定义好,在未来我们可以指向一个未知的函数。 这就是牛X的地方。你用一个现在的东西调用过去的东西很容易,但用现在的东西调用未来的东西就很神奇了吧!!!

    #include<iostream>

    using namespace std;

    class a_class

    {

    public:

       virtual void vf()

      {

         cout << "这是一个基类型的函数" <<endl;

      }

    };

    class b_class:public a_class

    {

      public:

       void vf()

    {

        cout << "这是第一个派生类的函数"<<endl;

    }

    };

    class c_class : public a_class

    {

      public:

      void vf()

       {

          cout << "这是第二个派生类的函数"<<endl;

       }

    };

    void func(a_class &m) //)&在此不是求地址运算,而是起标识作用,这里没有&意义一样,不影响。

    {

      m.vf();   //直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。

    }

    int main()

    {

       a_class a_obj;

       b_class b_obj;

       c_class c_obj;

       func(a_obj);

       func(b_obj);

       func(c_obj);

       return 0;

    }
    使用了基类引用调用了虚函数。
    虚属性继承:
    当一个继承了虚函数的派生类被另一个类派生类时,这个虚函数仍然可以被覆盖,但无论虚函数继承了多少次,他的本质仍然是虚函数。
    //定义一个基类
    class base
    {
    public: 
      virtual void v_func()
        {}
    }; 
    //定义一个基类的派生类
    class der1:public base
    {
      public:
        void v_func()
           {}
    } ;
    // 派生类的派生类
    class der2:public der1
    {
       public:
        void v_func()
       {}
    };
    当一个函数被基类声明为virtual时,这个函数可以被他的派生类所覆盖,假如没有被覆盖,派生类中的对象想要访问这个函数的时候,将调用基类中的函数。
    调用:base *p;
         Der1 d1;
         p = &d1;
        p -> v_func();
    纯虚函数与抽象类: 
    纯虚函数是指没有在基类中定义的虚函数。这个没有定义指的是没有函数体 即 { },而是用的 = 0 ;
    一般语法:
    virtual  type func-name(parameter list) = 0;
    一旦一个虚函数变为纯虚函数,这个时候,他的派生类必须覆盖这个纯虚函数,不然会出错。
    class a_class
    {
    public: 
    virtual double v_func() = 0;
      virtual int func() = 0
       {
           return 0;
       }
    };
    抽象类:含有纯虚函数的类为抽象类。
    作用:为多态类提供一个没有负担的接口,而接口的激活代码有派生类的覆盖函数提供。
    由于抽象类中包含了很多的纯虚函数,所以不能用它来定义或者初始化对象。
    尽管不能直接定义抽象类对象,但可以创建指向抽象类的指针与引用。
    我们把一个函数定义为纯虚函数,然后各个从基类派生出来的派生类真正地对其进行了重新定义,满足各自的需要。
    早期绑定与动态绑定 
    早期绑定就是静态绑定。一般在 我们编译的时候就确定需要调用某一个函数需要的所有信息,叫做早期绑定。一般包括函数的重载、正常函数的调用及重载运算符。  //发生在非虚函数的定义与基类的派生中。
    动态绑定就是后期绑定,一般在 运行时才确定的函数调用。我们可以使用虚函数来实现动态绑定。
    //发生在虚函数当中。

  • 相关阅读:
    String类中的常用方法(Java)
    Struts2的Lambda表达式的使用
    Struts2的环境搭建
    Servlet 3.0
    关于URLWriter的用法
    PrintStream与PrintWriter
    java中的System.nanoTime与System.currentTime
    java多线程之CyclicBarrier类
    多线程java IO之管道流
    消费者与生产者
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3965465.html
Copyright © 2020-2023  润新知