面向对象三大特点心得理解.......

来源:互联网 发布:java urlencode 编辑:程序博客网 时间:2024/04/30 02:46

面向对象的三大特征:封装,继承,多态

封装:其实是类和对象的主要特性, 即封装是通过类和对象来表现的。封装就是把可观的事物抽象为一个类, 这个类中有很多属性隐藏了起来, 本质上来说类的操作就是对属性的值的改变。通过一些类的方法来操纵这些属性。封装的实际内容就是一些属性和方法的集合。通过不同的访问权限达到这个封装的目的。


继承:首先要脱离C++语言来考虑继承。这个面向对象的继承是指能够使用现有类的所有功能,并在不重新编写现有类的基础上对这个类进行扩展。这种方式在C++可以通过两种方式完成:继承(这个是C++的特性,是为了完成面向对象而产生的)和组合。这里存在了Is-a, Has-a, User-a的区别和联系。


多态:在面向对象语言中,是指接口的多种不同的实现方式。不同的实例具有不同的行为。多态性是在C++中是通过虚函数实现的。它在C++中的实现方式有两个:覆盖和重载。在使用上可以这样理解:允许父类的指针或者对象引用子类的对象,意思是可以通过父类指针的强制转化或者对象的强制转化,或者直接使用指针调用方法来使用。这个主要是可以把子类上升到父类的高度来看问题,屏蔽子类对象之间的差异,写出通用性的代码。


关于多态的一段代码演示:

动态多态这就是众所周知的的多态。现代面向对象语言对这个概念的定义是一致的。其技术基础在于继承机制和虚函数。例如,我们可以定义一个抽象基类Vehicle和两个派生于Vehicle的具体类Car和Airplane: // dynamic_poly.h#include <iostream>// 公共抽象基类Vehicleclass Vehicle{public:    virtual void run() const = 0;};// 派生于Vehicle的具体类Carclass Car: public Vehicle{public:    virtual void run() const    {        std::cout << "run a car\n";    }};// 派生于Vehicle的具体类Airplaneclass Airplane: public Vehicle{public:    virtual void run() const    {        std::cout << "run a airplane\n";    }}; 客户程序可以通过指向基类Vehicle的指针(或引用)来操纵具体对象。通过指向基类对象的指针(或引用)来调用一个虚函数,会导致对被指向的具体对象之相应成员的调用: // dynamic_poly_1.cpp#include <iostream>#include <vector>#include "dynamic_poly.h"// 通过指针run任何vehiclevoid run_vehicle(const Vehicle* vehicle){    vehicle->run();            // 根据vehicle的具体类型调用对应的run()}int main(){    Car car;    Airplane airplane;    run_vehicle(&car);         // 调用Car::run()    run_vehicle(&airplane);    // 调用Airplane::run()}此例中,关键的多态接口元素为虚函数run()。由于run_vehicle()的参数为指向基类Vehicle的指针,因而无法在编译期决定使用哪一个版本的run()。在运行期,为了分派函数调用,虚函数被调用的那个对象的完整动态类型将被访问。这样一来,对一个Car对象调用run_vehicle(),实际上将调用Car::run(),而对于Airplane对象而言将调用Airplane::run()。 或许动态多态最吸引人之处在于处理异质对象集合的能力:  // dynamic_poly_2.cpp#include <iostream>#include <vector>#include "dynamic_poly.h"// run异质vehicles集合void run_vehicles(const std::vector<Vehicle*>& vehicles){    for (unsigned int i = 0; i < vehicles.size(); ++i)    {        vehicles[i]->run();     // 根据具体vehicle的类型调用对应的run()    }}int main(){    Car car;    Airplane airplane;    std::vector<Vehicle*> v;    // 异质vehicles集合    v.push_back(&car);    v.push_back(&airplane);    run_vehicles(v);            // run不同类型的vehicles}在run_vehicles()中,vehicles[i]->run()依据正被迭代的元素的类型而调用不同的成员函数。这从一个侧面体现了面向对象编程风格的优雅。 


宏多态:带变量的宏可以实现一种初级形式的静态多态

#include <iostream>#include <string>using namespace std;#define ADD(A,B) (A) + (B);//定义了泛化的宏ADDint main(){int a1 = 1;int a2 = 2;string str1 = ("Hello,");string str2 = ("World!");int a3 = ADD(a1, a2);//数字相加string str3 = ADD(str1, str2);//字符串相加cout << a3 << endl;cout << str3 << endl;return 0;}

函数多态也就是我们常说的函数重载(function overloading)。基于不同的参数列表,同一个函数名字可以指向不同的函数定义:  // overload_poly.cpp#include <iostream>#include <string>// 定义两个重载函数int my_add(int a, int b){    return a + b;}int my_add(int a, std::string b){    return a + atoi(b.c_str());}int main(){    int i = my_add(1, 2);                // 两个整数相加    int s = my_add(1, "2");              // 一个整数和一个字符串相加    std::cout << "i = " << i << "\n";    std::cout << "s = " << s << "\n";} 根据参数列表的不同(类型、个数或兼而有之),my_add(1, 2)和my_add(1, "2")被分别编译为对my_add(int, int)和my_add(int, std::string)的调用。实现原理在于编译器根据不同的参数列表对同名函数进行名字重整,而后这些同名函数就变成了彼此不同的函数。比方说,也许某个编译器会将my_add()函数名字分别重整为my_add_int_int()和my_add_int_str()。



原创粉丝点击