Hỏi đáp câu lệnh trong c++

Mọi người cho mình hỏi đoạn code này giải thích như nào ạ.

main()
{
    HINH * p[100];
    int n;

    cout << "nhapsoluong:"; cin >> n;
  
    for (int i = 0; i < n; i++){
        int chon;
        cout << "moi chon (1-HCN;2-H_TRON,3-TAM GAC)";
        cin >> chon;
      
        switch (chon)
        {
            case 1:
                p[[i] = new HCN();// mọi người cho mình hỏi đoạn này là gán như thế nào ạ.
                break;;
            case 2:
                p[[i] = new H_TRON();
                break;
            case 3:
                p[i] = new TAM_GIAC();
                break;
        }

        p[i]->nhap();// gọi tới nhập vậy lúc này sẽ gọi tới hàm nhập của lớp nào ạ.
    }

    for(int i = 0; i < n; i++){
        p[i]->in();
    }
}

Bài toán trên gồm có 4 lớp trong đó 3 lớn HCN,H_TRON,TAM_GIAC là kế thừa từ lớp HINH. tất cả các lớp đều có 2 hàm void nhap(), void in().

Mọi người giải thích dùm mình với ạ. cái này bạn mình gửi cho mình nhưng mình lại không hiểu hết được.

Gán bằng cách tạo một biến HINH trên Heap. Mình thật ra vẫn chưa hiểu câu hỏi này lắm

Câu còn lại: do tính đa hình của khái niệm OOP, các lớp kế thừa lớp cha đều được có thể lưu trữ dưới dạng một biến thuộc kiểu dữ liệu lớp cha. Nhưng khi gọi hàm thì code của lớp con sẽ được thực thi.

Vậy nên tuỳ theo phần tử đó thật sự là hình tròn hay hình tam giác, trình biên dịch sẽ gọi hàm của lớp đó. chứ không phải của lớp hình.

Bạn có thể kham khảo thêm ở đây:

1 Like

Mình sẽ trả lời bạn theo từng comment trong code vì mình nghĩ bạn còn thắc mắc những chỗ đó.

Comment 1
Bạn để ý đến cụm switch ... case, dùng để xác định loại hình vừa nhập là gì, sau đó sử dụng đa hình để khởi tạo phù hợp với p[i].
Ví dụ, nếu nhập 1 thì sẽ là HCN, thế nên sẽ tạo p[i] dựa trên class HCN. Các hình khác tương tự. Tính chất này gọi là đa hình, bạn có thể tìm hiểu thêm.

Comment 2
Khi gọi p[i] -> nhap() thì trước đó bạn khởi tạo p[i] với class nào thì phương thức nhap() của class đó sẽ được gọi.

2 Likes

2 bạn trên nói mình cũng hiểu hiểu rồi ạ. Nhưng ở chỗ in ra thì nó sẽ in ra hàm in() ở các lớp con hay lại chỉ in ở lớp cha ạ.

Còn tùy vào các class HCN, H_TRON, TAM_GIAC của bạn nữa, nếu các class con được ghi đè phương thức in() thì khi gọi nó sẽ gọi của lớp con. Còn nếu không được ghi đè thì sẽ gọi của lớp cha.

2 Likes

Phải set virtual thì mới dùng phương thức class con được :slight_smile: không thì tham chiếu kiểu gì thì dùng phương thức kiểu đó.

3 Likes

ban có thể chạy ví dụ nhỏ này để hiểu thêm

mọi người cho mình hỏi đoạn này là gán như thế nào ạ. => là gán nó thành class đó
gọi tới nhập vậy lúc này sẽ gọi tới hàm nhập của lớp nào ạ. => tuỳ theo nó sẽ chạy vào case nào thì nó chạy tới hàm nhập của class đó

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?