30/09/2018, 22:14

Kế thừa trong C++ với một số ý nhỏ

Mình có 2 class sau:

class A {
private:
 char* name;
protected:
 A() {
     name = new char[15];
 }
 
 ~A() {
     delete(name);
   }
}

class B: public A{
private:
   char* name;
public: 
   B():A() {// chỗ này là như thế nào nhỉ, có phải phải có thế này thì hàm khởi tạo mặc định của lớp A //mới được gọi không?
    name = new char[15];
}

~B() {
delete(name);
}
}

int main() {
B *p = new B();
delete(p);
getch();
return 0;
}

Một câu hỏi mình viết trong code.

Câu hỏi hai à khi hủy đối tượng của lớp B thì hai hàm hủy sẽ đươc gọi theo thứ tự nào A rồi đến B hay B rồi đến A;

Mong các bạn giải đáp giúp mình nhé!

Khánh Nguyễn viết 00:14 ngày 01/10/2018

Indent code lại cho dễ nhìn đi bạn.

Module Đk viết 00:27 ngày 01/10/2018

Làm thế nào bạn. Indent code ấy.

Khánh Nguyễn viết 00:29 ngày 01/10/2018

B():A() {// chỗ này là như thế nào nhỉ, có phải phải có thế này thì hàm khởi tạo mặc định của lớp A //mới được gọi không?

Chỗ này có hay không có A() thì hàm khởi tạo mặc định cũng sẽ được gọi.

Câu hỏi hai à khi hủy đối tượng của lớp B thì hai hàm hủy sẽ đươc gọi theo thứ tự nào A rồi đến B hay B rồi đến A;

Hàm hủy của B sẽ được gọi trước, sau đó tới A.

Lần sau bạn có thể tự mình tìm ra câu trả lời trước khi hỏi. Ví dụ câu số 2 đi, bạn có thể viết cho destructor của class A in ra một dòng gì đó khi đc gọi, tương tự cho destructor của B. Khi chạy thì bạn có thể xem dòng nào in trước để biết hàm nào được gọi trước.

Module Đk viết 00:17 ngày 01/10/2018

ừ thực ra lúc mình đăng câu hỏi thì mình hơi biếng (cái câu hai không cần thiết lắm) vấn đề là tiện thể mình đăng lên là hỏi với câu đầu tiên ấy, mục đích thật sự của việc gọi hàm constructor A() ấy vào constructor B() là để làm gì: cũng vẫn là cái đoạn B():A(){…} ấy. Tại mình tìm mãi mà không thấy? Hỏi các bạn cho nhanh.
Peace!

vũ xuân quân viết 00:25 ngày 01/10/2018

B():A()

Theo như trí nhớ trong C++ có quy định.
Hàm khởi tạo mặc định của lớp con sẽ ghi luôn hàm khởi tạo của lớp cha.
Nên ghi như vậy là đúng cú pháp của C++.

Còn muốn giải thích thêm nữa thì không biết. Vì cái này giống như mặc định trong C++ rồi.

Khánh Nguyễn viết 00:28 ngày 01/10/2018

mục đích thật sự của việc gọi hàm constructor A() ấy vào constructor B() là để làm gì

Như mình nói, nếu không ghi vẫn được. Còn ghi để rõ ràng hơn thôi bạn.

Module Đk viết 00:31 ngày 01/10/2018

thank gúy nhưng nếu bạn nào có thêm ý bổ sung thì cứ trả lời nhé

Bài liên quan
0