面向对象设计的三原则:封装、继承、多态。
1.封装:
封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
面向对象程序设计方法的一个重要特点就是“封装性”,所谓封装性,指两个方面的含义:一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。二是将对象中某些部分对外隐蔽,即隐藏其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。
例如,在抽象的基础上,我们可以将时钟的数据和功能封装起来,构成一个时钟类。
class Clock
{
public://共有成员,外部接口
void SetTime(int NewH,int NewM,int NewS);
void ShowTime();
private://私有成员,外部无法访问
int Hour,Minute,Second;
}
2.继承:
在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类”或“父类”。新建立的类称为“派生类”或“子类”。
一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。从另一角度来说,从已有的类(父类)产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。
派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。一代一代地派生下去,就形成类的继承层次结构。
继承性很好地解决了软件的可重用性的问题。比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。
单继承的定义格式如下:
class<派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
}
class Student
{
public:
void display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
private:
int num;
string name;
char sex;
}
class Student1:public Student
{
public:
void display_1()
{
cout<<"age:"<<age<<endl;
cout<<"address:"<<addr<<endl;
}
private:
int age;
string addr;
}
3.多态:
多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-黏贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行效果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。
所谓虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。
classA
{
public:
A(){}
virtual void foo()
{
cout<<"ThisisA."<<endl;
}
};
classB:publicA
{
public:
B(){}
void foo()
{
cout<<"ThisisB."<<endl;
}
};
int main(intargc,char*argv[])
{
A* a = new B();
a->foo();
if(a != NULL)
delete a;
return0;
}
这将显示:This is B.
如果把virtual去掉,将显示:This is A.
前面的多态通过使用虚函数virtual void foo()来实现。
面向对象程序设计具有许多优点:
1、开发时间短,效率高,可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。
2、应用程序更易于维护、更新和升级。继承和封装使得应用程序的修改带来的影响更加局部化。