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&);//赋值函数,没有时默认提供。
……;//自定义函数
}
继承:组合和继承(初始化列表)
多态:虚函数和纯虚函数(虚析构函数和纯虚析构函数)
内部机制运--运行时类型识别
- C++的面向对象浅析
- 面向对象-----浅析对象间的关系
- 面向对象的 C
- java 面向对象的原理及浅析
- 对js面向对象的浅析一。
- 从C++浅析面向对象的特点
- 面向对象浅析
- 浅析面向对象
- LUA面向对象浅析
- 浅析JavaScript面向对象
- Java面向对象浅析
- 面向对象浅析
- C语言的面向对象
- C的面向对象编程
- 【c#】 面向对象的编程
- C++:面向对象的基本特征
- 面向对象的C写法
- C++:面向对象的基本特征
- 先打开新购房款管理学发来松江巅峰肯学肯干
- HDU 2504 又见GCD【递归】
- ion
- 与前端设计师谈响应式设计
- android.view.inflateexception binary xml file line 异常的解决方法
- C++的面向对象浅析
- 还好就赶紧赶紧发的地方
- 2014年辛星解读CSS第八节 使用背景图片
- 辅导功课了脸上多了
- 那是人家让同事家庭聚会时突然突然就那天
- HDU 2016 数据的交换输出
- SGU 126Boxes(模拟题|二进制)
- HDU 2017 字符串统计
- STD::reverse_iterator