关于子类多继承下,使用多态的问题

C++小白在学习时,发现一个问题:在多继承的析构中,编译器会将new的子类的所有父类析构。进而在下一次释放new的另外一个继承于上一个子类的相同的父类的子类时,发生异常。

我认为原因在于:没有释放子类的内存,需要在父类重写析构函数为虚析构函数。

相关代码片

//计算机组装
class CPU {
public:
	virtual void Calculate() = 0;
	virtual ~CPU() = 0;
};
CPU::~CPU() {

}
class GPU {
public:
	virtual void display() = 0;
	virtual ~GPU() = 0;
};
GPU::~GPU() {

}
class Menory {
public:
	virtual void storage() = 0;
	virtual ~Menory() = 0;
};
Menory::~Menory() {

}

class Intel :public CPU, public GPU {
public:
	virtual void Calculate() {
		cout << "intel的CPU开始计算了" << endl;
	}
	virtual void display() {
		cout << "intel的GPU开始显示了" << endl;
	}
};

class AMD : public CPU, public GPU{
public:
	virtual void Calculate() {
		cout << "AMD的CPU开始计算了" << endl;
	}
	virtual void display() {
		cout << "AMD的GPU开始显示了" << endl;
	}
};
class NVIDIA :public GPU{
public:
	virtual void display() {
		cout << "NVIDIA的GPU开始显示了" << endl;
	}
};
class Samsung :public Menory {
public:
	virtual void storage() {
		cout << "Samsung的Menory开始储存了" << endl;
	}
};

class Computer {
public:
	Computer(CPU* cpu, GPU* gpu, Menory* menory) {
		this->cpu = cpu;
		this->gpu = gpu;
		this->menory = menory;
	}
	//提供工作函数
	void work() {
		this->cpu->Calculate();
		this->gpu->display();
		this->menory->storage();
	}
	virtual ~Computer() {
		cout << "Computer的析构函数调用" << endl;
		if (this->cpu != NULL) {
			delete this->cpu;
			this->cpu = NULL;
		}
		if (this->gpu != NULL) {
			delete this->gpu;
			this->gpu = NULL;
		}
		if (this->menory != NULL) {
			delete this->menory;
			this->menory = NULL;
		}
	}
private:
	CPU* cpu;
	GPU* gpu;
	Menory* menory;
};

void test06() {

	//组装
	Computer* computer1 = new Computer(new Intel, new AMD, new Samsung);
	//!!!子类析构时,需要在父类写虚析构函数
	computer1->work();
	delete computer1;
	cout << "------------------------------------------------" << endl;
	Computer* computer2 = new Computer(new AMD, new AMD, new Samsung);
	computer1->work();
	delete computer1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是几个涉及Java中继承多态问题。 1. 什么是继承?Java中如何实现继承继承是面向对象编程中的一种重要机制,它允许子类继承父类的属性和方法。在Java中,继承可以通过使用关键字“extends”来实现。子类通过继承父类,可以获得父类的非私有属性和方法,并且可以重写这些方法。 2. 什么是多态?Java中如何实现多态多态是面向对象编程中的另一个重要概念,它允许同一个方法在不同的对象上具有不同的行为。在Java中,多态可以通过使用继承和方法重写来实现。如果子类重写了父类的方法,那么在使用子类对象调用该方法时,会执行子类中的方法而不是父类中的方法。 3. 什么是抽象类?Java中如何定义抽象类? 抽象类是一种不能被实例化的类,它只能被继承。抽象类可以包含抽象方法和非抽象方法,而抽象方法是没有实现的方法,必须在子类中被实现。在Java中,抽象类可以使用关键字“abstract”来定义,任何包含抽象方法的类都必须被定义为抽象类。 4. 什么是接口?Java中如何定义接口? 接口是一种特殊的抽象类,它只包含常量、方法签名和默认方法的声明。接口中的方法都是抽象的,没有实现。在Java中,接口可以使用关键字“interface”来定义,任何实现了接口的类都必须实现接口中的所有方法。 5. 什么是向上转型和向下转型?在什么情况下需要进行转型? 向上转型是指将子类对象赋值给父类引用变量的过程。向下转型是将父类引用变量转换为子类对象的过程。在Java中,向上转型是自动的,而向下转型需要使用强制类型转换符进行转换。需要进行转型的情况是在父类中定义的方法不能满足子类的需求时,需要在子类中重写该方法并进行转型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值