【侯捷P11】面向对象编程

时间:2022-12-12 00:40:00


目录

  • ​​面向对象编程​​
  • ​​Composition(复合)​​
  • ​​构造和析构​​
  • ​​Delegation(委托)​​
  • ​​Inheritance(继承)​​
  • ​​虚函数与多态​​
  • ​​继承和composition关系下的构造和析构​​
  • ​​Delagation(委托)和Inheritance(继承)​​
  • ​​关于虚函数与纯虚函数、非虚函数​​

面向对象编程

为什么需要面向对象编程?

为了让类和类之间发生关系。

【侯捷P11】面向对象编程


Composition(复合)

表示has-a(有一个的关系)

【侯捷P11】面向对象编程

【侯捷P11】面向对象编程

【侯捷P11】面向对象编程


构造和析构

【侯捷P11】面向对象编程

其中红色的是C++为我们实现的。


Delegation(委托)

也叫Composition by reference(以指针复合)

【侯捷P11】面向对象编程

Inheritance(继承)

表示is-a的关系

【侯捷P11】面向对象编程

子类指向父类

继承函数,其实是继承的函数的使用权。

【侯捷P11】面向对象编程

虚函数与多态

【侯捷P11】面向对象编程

为什么会有这个模式?

一般地,可以先把共同的部分先写好,然后需要具体根据场景分别写的部分再交给子类完成。

【侯捷P11】面向对象编程

【侯捷P11】面向对象编程


继承和composition关系下的构造和析构

注意:这里的复合和继承都是先里面,后外面

【侯捷P11】面向对象编程

对于第一种情况,经过测试先后顺序为:先继承,再复合

测试程序如下

// P12_test.cpp
// 测试composition和继承的先后关系
// 先继承---->再复合

#include <iostream>
using namespace std;


class A
{
private:
/* data */
public:
A(/* args */);
virtual ~A();
};

A::A(/* args */)
{
cout<<"A的构造函数"<<endl;
}

A::~A()
{
}


class B
{
private:
/* data */
public:
B(/* args */);
~B();
};

class A_son:public A
{
public:
A_son(){
cout<<"A_son的构造函数"<<endl;

}
private:
B b;

};



B::B(/* args */)
{
cout<<"B的构造函数"<<endl;
}

B::~B()
{
}


int main(int argc, char const *argv[])
{
/* code */
A_son a_son;
return 0;
}


/*
输出结果为:

A的构造函数
B的构造函数
A_son的构造函数

所以得出结论:先继承---->再复合
*/

【侯捷P11】面向对象编程

Delagation(委托)和Inheritance(继承)

【侯捷P11】面向对象编程

关于虚函数与纯虚函数、非虚函数

【侯捷P11】面向对象编程