#include<iostream>
using namespace std;
class CPU {
public:
//抽象的计算函数
virtual void calculate()=0;
};
class VideoCard {
public:
//抽象的显示函数
virtual void display()=0;
};
class Memory {
public:
//抽象的存储函数
virtual void storage()=0;
};
//电脑类
class computer {
public:
computer(CPU* cpu, VideoCard* vc, Memory* mem) {
m_cpu = cpu;
m_vc = vc;
m_mem = mem;
}
void work() {
//零件工作起来,调用接口
m_cpu->calculate();
m_vc->display();
m_mem->storage();
}
//提供析构函数释放三个零件
~computer() {
if (m_cpu != NULL) {
delete m_cpu;
m_cpu = NULL;
}
if (m_mem != NULL) {
delete m_mem;
m_mem = NULL;
}
if (m_vc != NULL) {
delete m_vc;
m_vc = NULL;
}
}
private:
CPU * m_cpu;//cpu的零件指针
VideoCard* m_vc;//显卡零件指针
Memory* m_mem;//内存条存储指针
};
//具体厂商
//intel
class intelCPU:public CPU {
public:
virtual void calculate() {
cout << "intel的cpu开始计算" << endl;
}
};
class intelVideoCard :public VideoCard {
public:
virtual void display() {
cout << "intel的显卡开始运行" << endl;
}
};
class intelMemory :public Memory {
virtual void storage() {
cout << "intel的内存条开始存储" << endl;
}
};
//lenovo厂商
class lenovoCPU :public CPU {
public:
virtual void calculate() {
cout << "lenovo的cpu开始计算" << endl;
}
};
class lenovoVideoCard :public VideoCard {
public:
virtual void display() {
cout << "lenovo的显卡开始运行" << endl;
}
};
class lenovoMemory :public Memory {
virtual void storage() {
cout << "lenovo的内存条开始存储" << endl;
}
};
void test01() {
CPU* cpu = new intelCPU;
VideoCard* vc = new intelVideoCard;
Memory* mem = new intelMemory;
//创建第一台电脑
computer* com1 = new computer(cpu, vc, mem);
com1->work();
delete com1;
cout << "........................................" << endl;
//组装第二台点电脑
computer* com2 = new computer(new lenovoCPU, new lenovoVideoCard, new lenovoMemory);
com2->work();
delete com2;
}
int main() {
test01();
return 0;
}
运用多态完成组装电脑的案例。
1.释放内存
//创建第一台电脑
computer* com1 = new computer(cpu, vc, mem);
com1->work();
delete com1;
这一步释放com1这个对象,但是它里面的零件还没有释放,所以有:
//提供析构函数释放三个零件
~computer() {
if (m_cpu != NULL) {
delete m_cpu;
m_cpu = NULL;
}
if (m_mem != NULL) {
delete m_mem;
m_mem = NULL;
}
if (m_vc != NULL) {
delete m_vc;
m_vc = NULL;
}
}
进一步释放零件。
内存的四种分区
栈区(stack):编译器自动分配和释放的,主要存储的是函数的参数值,局部变量等值。发生函数调用时就为函数运行时用到的数据分配内存,函数调用结束后就将之前分配的内存全部销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部。栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值,在 VC/VS 下,默认是 1M。
堆区(heap):动态分配。一般由程序员分配和释放(动态内存申请malloc与释放free),需要手动free。否则会一直存在,若程序员不释放,程序结束时可能由操作系统回收。
全局区(静态区)(static):静态分配。全局变量和静态变量的存储是放在一块的,该区域在程序结束后由操作系统释放。
代码区:通常用来存放程序执行代码(包含类成员函数和全局函数及其他函数代码),这部分区域的大小在程序运行前就已经确定,也有可能包含一些只读的常数变量,例如字符串变量。new的作用
在实际的编程中,实际要处理的数据数量在编程时无法确定,所需的内存空间大小无法确定时,除了定义“尽可能大的空间”的方法,还有就是动态内存分配。此种内存分配是在程序运行中进行的,而不是在编译时就确定的,因此称为“动态内存分配”。在 C++ 中,通过 new 运算符来实现动态内存分配。
new开辟的空间在堆上。
当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。
new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。
2.创建对象
创建对象写法1:new一个对象,父类指针指向子类对象
CPU* cpu = new intelCPU;
VideoCard* vc = new intelVideoCard;
Memory* mem = new intelMemory;
//创建第一台电脑
computer* com1 = new computer(cpu, vc, mem);
创建对象写法2:
computer* com2 = new computer(new lenovoCPU, new lenovoVideoCard, new lenovoMemory);