01/10/2018, 16:08

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() << '
';
 
    return 0;
}
rogp10 viết 18:21 ngày 01/10/2018

Những class thừa kế một class có virtual function đều bị biến đổi để thực hiện virtual (dynamic binding) 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 đề.

Thược Nguyễn viết 18:18 ngày 01/10/2018

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

rogp10 viết 18:08 ngày 01/10/2018

Ví dụ thôi mà

Quan hệ thừa kế có tính chất bắc cầu 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.

Bài liên quan
0