zoukankan      html  css  js  c++  java
  • C++ 封装、继承、多态

    C++的封装:

      封装的是实现面向对象的第一步,封装就是将数据、函数等集合在一个单元也就是类中,封装的目的是使得代码模块化;封装的意义在于增强安全性和简化编程,使用者不必了解具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类成员。

      C++定义了友元函数能够访问类中的私有函数:友元函数

    eg:封装一个animal类

    #include <bits/stdc++.h>
    using namespace std;
    
    class Animal
    {
    public:
        string name;
        virtual void get_name(string animal_name)=0;
    };

    C++的多态:

      C++的多态性是通过虚函数实现的,虚函数允许派生类重新定义成员函数,而派生类重新定义基类的做法成为覆盖/重写(重写分2种:重写成员函数,重写虚函数,只有重写虚函数才能体现C++的多态性)。[说到重写,就要提到重载,重载是允许多个同名函数,这些同名函数的参数个数不同、参数类型不同,但重写并没有体现多态性,为什么C++支持重载而C语言不支持重载?]

      多态与非多态的实质区别就是函数地址是早绑定还是晚绑定,这里可以看c++的动态绑定和静态绑定;多态的目的就是接口重用。

    eg:见下面的例子:

    #include <bits/stdc++.h>
    using namespace std;
    
    class A
    {
    public:
        void foo()
        {
            printf("A::foo()
    ");
        }
        virtual void fun()
        {
            printf("A::fun()
    ");
        }
    };
    class B : public A
    {
    public:
        void foo()
        {
            printf("B::foo()
    ");
        }
        void fun()
        {
            printf("B::fun()
    ");
        }
    };
    
    int main(void)
    {
        A *a;
        B b;
        a=&b;
        a->foo(); //A::foo()
        a->fun(); //B::fun()
        cout<<"-----------"<<endl;
        A aa;
        B *bb;
        bb=(B *)&aa;
        bb->foo(); //B::foo()
        bb->fun(); //A::fun()
        return 0;
    }

    这里的详细的解释见:c++的动态绑定和静态绑定

    C++的继承:

      继承可以使得子类具有父类的各种属性和方法,而不是需要再次编写相同的代码,在令子类继承父类的同时,子类可以重新定义某些属性,并重新某些方法,即覆盖父类原有属性和方法,使其获得与父类不同的功能。

    eg:见下面例子

    #include <bits/stdc++.h>
    using namespace std;
    
    class A
    {
    public:
        virtual void f1(){cout<<"A::f1()"<<endl;}
        virtual void f2(){cout<<"A::f2()"<<endl;}
    };
    class B : public A
    {
    public:
        /*override的主要作用是告诉编译器该函数覆盖基类的同名函数,能够
        *防止人为定义时函数名或者参数不对等,导致未覆盖基类的函数,所以
        *添加override能够使程序员的意图更加明显
        */
        void f1() override{cout<<"B::f1()"<<endl;}
        //final:不允许其它类再次覆盖符f2()函数
        void f2() final {cout<<"B::f2()"<<endl;}
    };
    class C:public B
    {
    public:
        void f1(){cout<<"C::f1()"<<endl;}
    //    void f2(){cout<<"C::f2()"<<endl;} 出错,f2()被声明成final
    };
    
    int main(void)
    {
        A *a,aa;
        B *b,bb;
        C *c,cc;
    
        b=(B*)&aa;
        b->f1();//A::f1()
        b->f2();//B::f2()
        c=(C*)&cc;
        c->f1();//C:f1()
        c->f2();//B::f2()
        cout<<"-------------"<<endl;
    
        a=&bb;
        a->f1();//B::f1()
        a->f2();//B::f2()
        b=&cc;
        b->f1();//C::f1()
        b->f2();//B::f2()
        cout<<"-------------"<<endl;
        return 0;
    }
  • 相关阅读:
    MySQL初步
    学会编写Android Studio插件 别停留在用的程度了
    IDEA创建Java项目并配置servlet
    nginx 安装
    推荐博主
    ssh调试及指定私钥
    程序员接私活必备的 10 个开源项目
    springboot项目搭建java项目后台框架
    JAVA程序员常用网站/工具集合
    linux安装JDK教程JAVA相关
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9528599.html
Copyright © 2011-2022 走看看