Hàm virtual của lớp trong C++

Cho mình hỏi tại sao code này lại in ra C vậy ạ? Mình nghĩ B và C không virtual thì kết quả phải là B chứ nhỉ?:

class A
{
public:
    virtual const char* getName() { return "A"; }
};
 
class B: public A
{
public:
    const char* getName() { return "B"; }  
};
 
class C: public B
{
public:
    const char* getName() { return "C"; } 
};
 
class D: public C
{
public:
    const char* getName() { return "D"; } 
};
 
int main()
{
    C c;
    B &rBase = c; 
    std::cout << rBase.getName() << '\n';
 
    return 0;
}

Những class thừa kế một class có virtual function đều bị biến đổi để thực hiện virtual (dynamic binding) :smiley: vì thế nên mới gọi được đúng method của subclass, [spoiler]chứ không là cứ thế mà lấy method của class của con trỏ thôi.[/spoiler] Tức là mỗi đối tượng (instantiation) như vậy đều phải lưu con trỏ của method ứng với class tạo ra nó bằng cách nào đó. Bạn thử thay B &rBase bằng A &rBase là sẽ thấy ngay vấn đề.

1 Like

Cá nhân mình thấy ko nên viết chương trình phức tạp thế này :joy:

1 Like

Ví dụ thôi mà :smiley:

Quan hệ thừa kế có tính chất bắc cầu :slight_smile: nên A có virtual thì C, D cũng virtual nốt. Vì nếu không thì virtual là vô nghĩa: nếu con trỏ A* trỏ đến C, D mà không nhận C, D thì mất tính đa hình.

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