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, chứ không là cứ thế mà lấy method của class của con trỏ thôi. 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 đề.

2 Likes

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?