#include <iostream>// CPU基类
class CPU {
public:virtual ~CPU() {}virtual void process() = 0;
};// GPU基类
class GPU {
public:virtual ~GPU() {}virtual void render() = 0;
};// RAM基类
class RAM {
public:virtual ~RAM() {}virtual void storage() = 0;
};// 英特尔CPU子类
class InterCpu : public CPU {
public:void process() override {std::cout << "Intel CPU is processing." << std::endl;}
};// 英特尔GPU子类
class InterGpu : public GPU {
public:void render() override {std::cout << "Intel GPU is rendering." << std::endl;}
};// 英特尔RAM子类
class InterRam : public RAM {
public:void storage() override {std::cout << "Intel RAM is storing data." << std::endl;}
};// 联想CPU子类
class LenovoCpu : public CPU {
public:void process() override {std::cout << "Lenovo CPU is processing." << std::endl;}
};// 联想GPU子类
class LenovoGpu : public GPU {
public:void render() override {std::cout << "Lenovo GPU is rendering." << std::endl;}
};// 联想RAM子类
class LenovoRam : public RAM {
public:void storage() override {std::cout << "Lenovo RAM is storing data." << std::endl;}
};// 组装电脑类
class Computer {
public:// Computer(CPU* cpu, GPU* gpu, RAM* ram) {// m_cpu = cpu;// m_gpu = gpu;// m_ram = ram;// }// 第二种写法Computer(CPU* cpu, GPU* gpu, RAM* ram) : m_cpu(cpu), m_gpu(gpu), m_ram(ram) {}void work() {m_cpu->process();m_gpu->render();m_ram->storage();}~Computer() {delete m_cpu;delete m_gpu;delete m_ram;}private:CPU* m_cpu;GPU* m_gpu;RAM* m_ram;
};int main() {Computer* c1 = new Computer(new InterCpu(), new InterGpu(), new InterRam());c1->work();delete c1; // 这里会释放c1并且调用Computer的析构函数,从而释放new InterCpu, new InterGpu, new InterRamreturn 0;
}
在子类的虚函数后加override关键字主要有以下原因和作用:
1. 为了表明子类的该虚函数是重写(override)了基类的虚函数,增加代码的可读性和明确性。
2. C++编译器会检查override标记的函数是否真的重写了基类中的虚函数,如果签名不完全匹配,会报编译错误,增加安全性。
3. 如果基类中的虚函数签名修改了,比如参数类型变了,加了override的子类在编译时就会报错,提醒修改,避免语义错误。
4. 有些编译器(如gcc)针对override方法会进行优化,提高执行效率。
所以,总体来说加override关键字是为了增加可读性、检查正确性和提高效率,尽管不写也可以成功编译,但添加override是一个好的编程习惯。
不添加override可以成功编译运行,但是会失去上述的这些好处,可能出现难以发现的错误,所以通常建议加上override。