赞
踩
思想与Java差不多
class 子类 : 继承方式 父类
若子类和父类,有相同名字的成员(属性/方法)。
处理方式一致
语法: class 子类 : 继承方式 父类1 , 继承方式 父类2...
。如果有同名成员出现,加作用域区分。
一些问题:
解决:
再举个例子:
小贴士:静态绑定在程序运行中不可更改,记住这个
在下面准备两个类,都有speak方法
没有产生希望的 ”小猫在说话”:
Animal &animal
等同于 Animal & animal = cat
animal.speak
应该是:小猫 才对。但是因为草绑定,绑定的是父类Animal类。解决方式:虚函数。可以实现地址晚绑定,从而实现动态多态
多态条件:
使用条 件:
父类和子类都有虚函数表
虚函数表内部记录当前作用域中虚函数(speak)的地址
当子类重写父类的虚函数,子类的虚函数表中内容就会被覆盖
多态的关键是虚函数指针和虚函数表
父类:抽象计算器
子类:加/减/乘/除法计算器
多态:getResult声明为虚函数,期待各种子类重写
多态方便维护某个加/减/乘/除计算器
和Java很像:在父类中声明纯虚函数,强制子类重写该函数。有纯虚函数的类叫抽象类,不能实例对象。
定义抽象类:
重写两个子类内部的方法
使用多态接口,传入父类的指针,调用传入子类的 重写的方法。
用小猫和Animal的父类子类举例:
其构造函数中,在堆区new一个字符串,m_Name指向这个字符串。
发现cat的析构函数没有执行,也就是说m_Name没有被释放
修改父类中的析构函数为虚析构:
总结:
//三个零件 抽象类: //CPU基类/父类 class CPU { public: virtual void caculate() = 0; }; class GPU { public: virtual void show() = 0; }; class Memory { public: virtual void storage() = 0; };
// 电脑类: class Computer { public: //记得加权限 //构造时传入三个指针,并保存在本类中 Computer(CPU* cpu, GPU* gpu, Memory* mem) { this->m_cpu = cpu; this->m_gpu = gpu; this->m_mem = mem; } void dowork() { //分别调用传入的三个类,对应的方法 m_cpu->caculate(); m_gpu->show(); m_mem->storage(); } //用来释放下面的三个零件指针 ~Computer() { if (m_cpu != NULL) { delete m_cpu; m_cpu = NULL; } if (m_gpu != NULL) { delete m_gpu; m_gpu = NULL; } if (m_mem != NULL) { delete m_mem; m_mem = NULL; } } // 三个零件指针 private: CPU* m_cpu; GPU* m_gpu; Memory* m_mem; };
//两个具体厂商: class IntelCPU :public CPU { public: //重写抽象类中的虚函数 void caculate() { cout << "IntelCPU" << endl; } }; class IntelGPU :public GPU { public: void show() { cout << "IntelGPU" << endl; } }; class IntelMem :public Memory { public: void storage() { cout << "IntelMem" << endl; } }; class LenCPU :public CPU { public: void caculate() { cout << "LenCPU" << endl; } }; class LenGPU :public GPU { public: void show() { cout << "LenGPU" << endl; } }; class LenMem :public Memory { public: void storage() { cout << "LenMem" << endl; } };
void test01() {
IntelCPU* icpu = new IntelCPU;
IntelGPU* igpu = new IntelGPU;
IntelMem* imem = new IntelMem;
//也可以:
//CPU* icpu = new IntelCPU;
//GPU* igpu = new IntelGPU;
//Memory* imem = new IntelMem;
Computer* computer1 = new Computer(icpu, igpu, imem);
computer1->dowork();
delete computer1; //释放new出来的对象
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。