C++面向对象程序设计(下)
面向对象程序设计的三大特征:
封装(Encapsulation)是基础,继承(Inheritance)是关键,多态(Polymorphism)是补充,而多态又必须存在于继承的环境中,多态的实现受到继承性的支持。
封装(Encapsulation)
(1)将数据抽象的外部接口与内部实现的细节清楚地分开;
(2)封装就是将抽象得到的数据和行为相结合,形成一个有机的整体。
封装主要依靠对类、数据和方法的访问控制,从语法上讲就是加上private、protected、public等关键词。
作用:
(1)可以隐藏实现细节。
(2)封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,特定的访问权限来使用类的成员。
(3)封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
继承(Inheritance)
继承是类与类之间共享数据和方法的一种机制,被继承的类称为父类,也叫基类或超类;继承的类称为子类,也叫派生类。继承是实现代码重用的重要手段,
(1)子类可以从父类继承数据成员和成员函数,提高编程效率。
(2)通过继承关系利用已有类构造新类。
作用:代码重用
(1)避免代码重复开发,减少代码和数据冗余。
(2)通过增强一致性来减少模块间的接口和界面。
多态(Polymorphism)
(1)不同的对象收到相同的消息时产生多种不同的行为方式。
(2)同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
多态性又被称为“ 一个名字,多个方法”。
实现多态,常用方式:
覆盖:是指子类重新定义父类的虚函数的做法。
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
作用:
使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码。此外,使用多态也能起到精简代码的作用。
C++封装
封装:是指类把数据成员和成员函数包含在一起成为一个整体,仅对外公开接口和对象进行交互。C++的封装相当于是class+访问限定符。语法:
class 类名{ 访问权限:数据成员或成员函数}
公共权限 public :成员类 内部可以访问 类外部可以访问
保护权限 protected : 内部可以访问 类外不可访问
私有权限 private :内部可以访问 类外不可访问
【在C++中,public、protected和private被称为访问权限修饰符(access specifiers,访问说明符)或访问修饰符(access modifiers)。】
protected 与private区别
主要在继承方面:protected :父亲的东西 继承人也可以访问;private:父亲的小秘密,继承人不可以访问的。
class 默认为private
例、c++封装的例子,代码如下:
#include<iostream>
#include<string>
using namespace std;
class Person{
public:
void setName(string name){
m_Name = name;
}
string getName(){
return m_Name;
}
void setAge(int age){ //在set中经常加入条件判断输入的数据是否合法
if(age>150 || age<0){
cout<<"不是人"<<endl;
return;
}
else{
m_Age = age;
}
}
int getAge(){
return m_Age;
}
private:
string m_Name;
string m_Lover;
int m_Age;
};
int main(){
Person onePerson; //实例化
onePerson.setName("GUGU");
cout<<"姓名:"<<onePerson.getName()<<endl;
onePerson.setAge(200);
cout<<"年龄:"<<onePerson.getAge()<<endl;
onePerson.setAge(18); //同一个对象同一个数据成员赋值两次
cout<<"年龄:"<<onePerson.getAge()<<endl;
//cout<<onePerson.Lover()<<endl; 不能直接改变私有数据成员 会报错
}
运行之,参见下图:
C++继承
继承作为三大特性之一,是使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承呈现了面向对象程序设计的层次结构,继承是类设计层次的复用。
C++继承的一般语法为:
class 派生类名:[继承方式] 基类名{
派生类新增加的成员
};
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。继承方式项是可选项,如果不写,默认为 private(成员变量和成员函数默认也是 private)。
继承的简要示意如下:
//A类为基类
class A{
public:
int a;
};
// B 继承于 A
class B : public A {
public:
int b;
};
B类继承自A类也就是A类派生了B类。A类称为基类或父类,B类称为派生类或子类。
例、演示C++类的继承的例子,假设有一个基类 Shape,Rectangle 是它的派生类。代码如下:
#include <iostream>
using namespace std;
// 基类
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 派生类
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
运行之,参见下图:
不同的继承方式会影响基类成员在派生类中的访问权限。
C++多态
多态是指不同继承关系的类对象去调用同一函数时,产生了不同的行为。
例如:Student类继承了Person类。 Person对象买票全价,Student对象买票半价。这就是多态行为。
实现一个简单的多态例子:
#include <iostream>
using namespace std;
class Person
{
public:
virtual void BuyTicket()
{
cout << "买票全价" << endl;
}
};
class Student : public Person
{
public:
virtual void BuyTicket()
{
cout << "半价买票" << endl;
}
};
void Func(Person& people)
{
people.BuyTicket();
}
int main()
{
Person p;
Func(p);
Student s;
Func(s);
}
运行之,参见下图:
附录
C++虚函数、纯虚函数、抽象类和多态介绍 https://blog.csdn.net/cnds123/article/details/131832675