C++的面向对象浅析

来源:互联网 发布:匿名朋友圈源码 编辑:程序博客网 时间:2024/05/22 16:03

面向对象的基本特征

三个基本特征

(1 )封装:将客观事物抽象成类,每个类对自身的数据和方法实行保护(private, protected,public),最基本的特性,是后续特性的基础。封装保护了代码安全—类型???

(2)继承:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。继承实现了代码重用—对象???

(3)多态:系统能够在运行时,能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性。多态增强了代码能力—健壮???

相关概念解读

1、”Object is everything”和“Everythingis object”的理解:

(1)”Object is everything”:C++主要是一门面向对象的程序设计语言。

(2)“Everything is an object”:在C++设计中对象是虚拟的,没有定义对象的具体边界,一切都可以是对象,对象时根据需求来设计的。

2、关联、聚合、组合、继承的区别

三者描述对象的附属[即依赖]关系: 关联<聚合<组合<继承,即必需性(依赖)逐渐加强。

(1)关联:整体与整体之间的关系且两个整体可以单独存在,关联类与被关联类没有相同的生命周期。如学生和课程: 每个学生可以选不同的课,每门课上有不同学生。

(2)聚合:(consist-of)整体与部分之间的关系且部分可以脱离整体而单独存在,聚合类与被聚合类没有相同的生命周期。如电脑和耳机:电脑包含耳机,但耳机也可以单独存在或插在MP3上。实现的形式是:class OBJ {...}  class A { OBJ*obj; .....}。

(3)组合:(part-of)整体与部分之间的关系且部分不能脱离整体而单独存在,组合类与被组合类有相同的生命周期。比如iPhone上的电池:原则不能拆下来单独使用,实现的形式是: class OBJ {...}  class A { OBJobj; .....}。

(4)继承:(knid-of)整体与部分之间的关系且部分不能脱离整体而单独存,被继承的类生命周期长于继承类。如大学生和学生:大学生是学生的一种。

3、虚函数、纯虚函数的区别

(1)虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。形式为virtual int func(int){…}。主要实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

(2)纯虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。形式为virtual int func(int)=0。主要实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。且有纯虚函数的类为抽象类即虚类(接口),不能被实例化。

例子解析

代码实例(菱形继承)

菱形继承是一种稍微复杂但是很典型的关于继承的案例,包含知识点非常多,应该好好理解。

//个体OBJ定义class OBJ{    int obj;    OBJ(int num){obj=num};}//接口(基类)A定义class A{private:    OBJ obja;//不需要new吗?public:    //构造函数不能为虚函数,在构造时构造顺序为基类到派生类,实现多态且当用基类操作派生类时是new的派生类,不用担心只构造基类而不构造派生类。    A(int a):obja(a){};    //析构函数可以为虚函数,在析构时析构顺序为派生类到基类,实现多态且当用基类操作派生类时是delete的基类指针或引用,防止只析构基类而不析构派生类。    //析构函数也可为纯虚函数,作用一样,同时为适应基类中没PV_func这样纯虚函数且还保证基类为抽象类而设计的,且纯虚析构函数要有函数体而不必再派生类中定义。    virtual ~A(){};    virtual char V_func(){cout<<"A"<<endl;};//虚函数    virtual int PV_func()=0;//纯虚函数,导致了A为抽象类,不能被实例化}//中间派生类B1定义class B1:virtual public A{private:    OBJ objb1;public:    B1(int b1a,int b1):A(b1a),objb1(b1){};    virtual ~B1(){};    virtual char V_func(){cout<<"B1"<<endl;};    virtual int PV_func(){cout<<"B1"<<endl;};}//中间派生类B2定义class B2:virtual public A{private:    OBJ objb2;public:    B1(int b2a,int b2):A(b2a),objb2(b2){};    virtual ~B2(){};    virtual char V_func(){cout<<"B2"<<endl;};    virtual int PV_func(){cout<<"B2"<<endl;};}//高层派生类C定义class C:public B1,public B2{private:    OBJ objc;    int c;public:    C(int ca,int cb1,int cb2,int c1,int c2):A(ca),B1(cb1),B2(cb2),objc(c1){c=c2;};    virtual ~C(){};    virtual char V_func(){cout<<"C"<<endl;};    virtual int PV_func(){cout<<"C"<<endl;};}

代码讲解

封装:类的基本结构

class OBJ{

        数据成员;

        函数成员:

              OBJ();//默认构造函数,没有时默认提供

                              ~OBJ();析构函数,没有时默认提供

              OBJ(const OBJ &)//复制函数,没有时默认提供

              OBJ& operator= (const A&);//赋值函数,没有时默认提供。

              ……;//自定义函数

}

继承:组合和继承(初始化列表)


多态:虚函数和纯虚函数(虚析构函数和纯虚析构函数)


内部机制运--运行时类型识别



0 0