面向对象的三个基本特征
面向对象的三个基本特征是:封装、继承、多态。其中,封装为了隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类),它的目的是为了——代码重用。而多态则是为了实现另一个目的——接口重用!
数据封装
数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。C++ 通过创建类来支持封装和数据隐藏(public、protected、private)。类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。默认情况下,在类中定义的所有项目都是私有的。例如:
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
变量 length、breadth 和 height 都是私有的(private)。这意味着它们只能被 Box 类中的其他成员访问,而不能被程序中其他部分访问。这是实现封装的一种方式。为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。如下示例:
class Adder{
public:
Adder(int i = 0) // 构造函数
{
total = i;
}
void addNum(int number) // 对外的接口
{
total += number;
}
int getTotal() // 对外的接口
{
return total;
};
private:
int total; // 对外隐藏的数据
};
int main( )
{
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
封装可以隐藏实现细节,使得代码模块化;封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面!!!
继承
什么是继承?
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。 通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承方式有哪些?
公有继承 (一般都使用公有继承)
基类中公有成员和保护成员访问权限不变,私有成员变为不可访问。
私有继承(默认)
基类中公有成员和保护成员变为私有成员,私有成员变为不可访问。
保护继承
基类中公有成员和保护成员变为保护成员,私有成员变为不可访问。
继承中的构造与析构?(构造顺序:先父母、再朋友、再自己;析构顺序正好相反)
创建派生类对象时首先调用基类的构造函数,然后再执行派生类的构造函数
释放派生类对象时首先析构派生类的析构函数,然后再执行基类的析构函数
多继承的一个实例?
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
多态(调用’同名函数’却会因上下文不同会有不同的实现的一种机制)
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
https://my.oschina.net/zhjunjun/blog/1505594
参考原文:
[1] https://blog.csdn.net/ruyue_ruyue/article/details/8211809
[2] http://www.runoob.com/cplusplus/cpp-data-encapsulation.html
[3] http://www.runoob.com/cplusplus/cpp-inheritance.html