面向对象的三大特点
-
1.封装-
- 将不同的小对象封装成一个大对象
- 把一部分内部属性和功能对外界屏蔽
-
2.继承
- 单继承
- 多继承
- 开放性
- 可扩充性
-
3.多态
- 相同的行为可作用于多种类型的对象上并获得不同的结果
向对过程编程开发的程序
- 算法 + 数据结构
向对对象
- 设计所需的各种类和对象, 决定把哪些数据和操作封装在一起
- 考虑怎样向有关的对象发送消息
类的定义
class 类名标识符
{
public:
数据成员
成员函数
private:
数据成员
成员函数
protected:
数据成员
成员函数
};
运算符重载
operator 类型名()
对于++ --运算符,由于涉及前置运算符和后置运算符,如果重载运算符没有参数,而表示前置运算
- 前置运算
void operator++()
{
++m_pages;
}
- 后置运算
void operator++(int)
{
++m_pages;
}
二义性
派生类在调用成员函数时,先在自身的作用域内寻找,如果找不到,会到基类中寻找,但当派生类继承的基类中有同名成员时,派生类中就会出现来自不同基类的同名成员
class CBaseA
{
public:
void function();
};
class CBaseB
{
public:
void function();
};
class CDeriverC:public CBaseA,public CBaseB
{
//没有定义function 不知道调用哪一个基类
};
虚函数 virtual
- 多态性通过联编实现
- 静态联编
- 对态联编
- 在C++中根据联编的时刻不同,存在两种类型的多态性
- 函数重载 重载是同一层次函数名相同
- 虚函数 覆盖是在继承层次中成员函数的函数原型完全相同
在基类中用virtual声明成员函数为虚函数, 在派生类中重新定义此函数,改变函数的功能.
- 当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数
- 如果派生类没有覆盖基类的虚函数,则调用基类的函数
利用虚函数实现动态绑定
- 对态绑定的实现方法
- 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象,通过该指针变量调用此虚函数
```
#include<iostream>
using namespace std;
class CEmployee
{
public:
int m_ID;
char m_Name[128];
char m_Depart[128];
CEmployee()
{
memset(m_Name,0,128);
memset(m_Name,0, 128);
}
virtual void OutputName()
{
cout << "员工姓名:" << m_Name << endl;
}
};
class COperator :public CEmployee
{
public:
char m_Password[128];
void OutputName()
{
cout << "操作员姓名:" << m_Name << endl;
}
};
int main()
{
CEmployee *pWorker = new COperator();
strcpy_s(pWorker->m_Name, "MR");
pWorker->OutputName();//操作员姓名:MR
delete pWorker;
return 0
}
```
虚函数的限制
- 只有类的成员函数才能为虚函数
- 静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象
- 内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的
- 构造函数不能是虚函数,析构函数通常是虚函数
虚继承(解决多继承时构造函数重复调用的问题)
- 通常,在定义一个对象时,先依次调用基类的构造函数,最后才调用自身的构造函数
- 对于虚继承来说,只调用一次
- 如果能够用单继承实现的,尽量不要用多继承
抽象类
含有纯虚函数的类称为抽象类
virtual 类型 函数名(参数列表)=0
对于含有纯虚函数的类来说,是不能能够实例化的
抽象类通常用于作为其他类的父类,从抽象类派生的子类如果不是抽象类,必须实现父类中的所有纯虚函数