一.简介
1.可维护
2.可复用
3.可扩展
4.灵活性好
面向对象的设计思想就是通过封装 继承 多态把程序的耦合性降低,使得程序更加的灵活,容易修改,并且易于复用
面向对象的五大基本原则
1.单一职责原则(SRP)
2.开放封闭原则(OCP)
3.里氏替换原则(LSP)
4.依赖倒置原则(DIP)
5.接口隔离原则(ISP)
函数编程
泛型编程
元编程
二.封装
class A{ public: A(int a){ } }
1.重载(Overload)
三.继承
class B: public A{ public: B(int a,int b):A(a){ } }; class C:public A{ public: C(int a,int c):A(a){ } }; //C++允许多继承 class D:public B,public C{ public: D(int a,int b,int c):B(a,b),C(a,c),A(a){ } };
1.继承的调用顺序
#pragma once #include <iostream> using namespace std; class F{ public: F(){ k5 = 10; cout << "F:F()" << endl; } ~F(){ cout << "F:~F()" << endl; } //virtual ~F(){} void FuncA(){ cout << "F:FuncA()" << endl; } virtual void FuncB() { cout << "F::FuncB()" << endl; } int k5; protected: int k4; }; class Z : public F{ public: Z(){ k5 = 5; cout << "Z:Z()" << endl; } ~Z(){ cout << "Z:~Z()" << endl; } void FuncA(){ cout << "Z::FuncA()" << endl; } void FuncB() { cout << "Z::FuncB()" << endl; } int k5; protected: int k4; };
#include "Jicheng.h" int main() { F* a = new F(); //F() cout << endl; F* a1 = new Z(); //F() Z() cout << endl; Z* a2 = new Z(); //F() Z() cout << endl; //Z* a3 = new F(); 错误 a->FuncA(); //F:FunA() a1->FuncA(); //F:FunA() a2->FuncA(); //Z:FunA() 如果子类没有相应的函数,那么会调用父类的函数 a->FuncB(); //F:FunB() a1->FuncB(); //Z:FunB() a2->FuncB(); //Z:FunB() int k5 = a->k5; //10 int k4 = a1->k5; //10 int k3 = a2->k5; //5 //int k55 = a->k4; k4是保护成员,无法访问 delete a; //~F() cout << endl; delete a1; //如果父类析构函数加virtual 那么会多一个子类的析构函数 ~Z() ~F() cout << endl; delete a2; //~Z() ~F() cout << endl; system("pause"); return 0; }
2.继承的访问权限
(1)类继承访问权限
父类的private成员无法被继承
(1)public继承:父类的public/protected成员继承到子类的访问权限不变
(2)private继承:父类的public/protected成员继承到子类变为private
(3)protected继承:父类的public/protected成员继承到子类变为protected
(2)成员访问权限
(1)private:①能被基类函数 ②能被友元函数 访问,无法被基类对象访问
(2)protected:①能被基类函数 ②能被友元函数 ③能被子类函数 访问,无法被基类对象访问
(3)public:①能被基类函数 ②能被友元函数 ③能被子类函数 ④能被基类对象
四.多态
多态有四种形态:
1.虚函数多态(动态多态,在运行时确定,覆盖)
2.模板多态
3.重载(静态多态,在编译时确定)
4.转换