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()\n");
    }
    virtual void fun()
    {
        printf("A::fun()\n");
    }
};
class B : public A
{
public:
    void foo()
    {
        printf("B::foo()\n");
    }
    void fun()
    {
        printf("B::fun()\n");
    }
};

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;
}
posted @ 2018-08-24 11:02  ybf&yyj  阅读(800)  评论(0编辑  收藏  举报