您的位置:首页 > 编程语言 > C语言/C++

C++ 封装、继承、多态

2018-08-24 11:02 323 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: