01/10/2018, 01:00

Destructor ở lớp dẫn xuất trong kế thừa c++?

chào các bạn
trong phần kế thừa ở c++
hàm khởi tạo lớp cở sở sẽ chạy trước hàm khởi tạo lớp dẫn xuất
còn hàm hủy thì ngược lại, thì định nghĩa như thế nào nhỉ?
xin cam ơn

#include <iostream>
using namespace std;

class day{
protected:
	int ngay;
public:
	day(int ngay = 1){
		this->ngay = ngay;
	}

	~day(){

	}

	day(const day &n){
		this->ngay = n.ngay;
	}

	void output(){
		cout << "Ngay " << ngay << endl;
	}
};

class month : public day{
private:
	int thang;
public:
	month(int ngay = 1, int thang = 1) : day(ngay){
		this->thang = thang;
	}
	~month() : ~day(){   //  here?

	}

};

int main(){

	system("pause");
	return 0;
}
kiencon viết 03:14 ngày 01/10/2018

bạn không cần định nghĩa gì trong class kế thừa trừ khi muốn thay đổi thuộc tính nào đó, hàm dựng và hàm hũy sẽ được gọi tự động. Bạn debug từng bước sẽ thấy nó chạy như thế nào.

HelloWorld viết 03:03 ngày 01/10/2018

ví dụ giờ chương trình mình có con trỏ như thế này, ở trên là mình lười viết , biến thường thì bộ thu gom sẽ tự dọn dẹp, nhưng con trỏ thì hàm hủy phải chạy chứ nhỉ

#include <iostream>
using namespace std;

class day{
protected:
	int *ngay;
public:
	day(int ngay = 1){
		this->ngay = ngay;
	}

	~day(){
              delete ngay;
	}

	day(const day &n){
		this->ngay = n.ngay;
	}

	void output(){
		cout << "Ngay " << ngay << endl;
	}
};

class month : public day{
private:
	int *thang;
public:
	month(int ngay = 1, int thang = 1) : day(ngay){
		this->thang = thang;
	}
	~month() {   // vậy biến ngay ở lớp day đã được xóa chưa?
             delete thang;
	}

};

int main(){

	system("pause");
	return 0;
}
HelloWorld viết 03:00 ngày 01/10/2018

@kiencon

kiencon viết 03:06 ngày 01/10/2018

tất nhiên, mình nói đơn giản thế này, trong class có con trỏ thì hàm hủy của nó phải giải phóng con trỏ đó, giải phóng trước hay sau giữa các class cơ sở và kế thừa thì tùy ngôn ngữ. Như ví dụ bạn đưa thì nó đã được giải phóng toàn bộ rồi.

HelloWorld viết 03:01 ngày 01/10/2018

nghĩa là ở class dẫn xuất, muốn dùng hàm khởi tạo của class cở sở thì phải gọi

month(int ngay = 1, int thang = 1) : day(ngay){
		this->thang = thang;
	}

còn muốn dùng hàm hủy của class cơ sở thì k cần phải gọi gì cả hả bạn?

kiencon viết 03:08 ngày 01/10/2018

mình có nói ở trên, là hàm hủy và hàm dựng đều được gọi tự động khi đối tượng được tạo ra, bạn không cần phải gọi trong lớp kế thừa trừ khi bạn muốn thay đổi thuộc tính của lớp cơ sở qua hàm set ở lớp cơ sở, ở đây hàm set phải được khai báo là hàm ảo để sử dụng được ở lớp kế thừa bằng từ khóa vitural

Tao Không Ngu. viết 03:10 ngày 01/10/2018

Hi Nấm Lùnhell6w9rld.
Mình hơi tò mò sao bạn lại kế thừ tháng từ ngày vây ?

HelloWorld viết 03:10 ngày 01/10/2018

mình lấy ví dụ đại để nói cái destructor thôi

Truongmta viết 03:12 ngày 01/10/2018

bạn delete luôn biến ngày ở lớp cơ sở thì lớp kế thừa bạn ko sử dụng được biến ngày nữa rồi vì nó đã được giải phóng mất luôn sau khi lớp cơ sở thực hiện xong rồi.

Bài liên quan
0