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;
}
Bài liên quan





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 &rBasebằngA &rBaselà sẽ thấy ngay vấn đề.Cá nhân mình thấy ko nên viết chương trình phức tạp thế này
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ì
virtuallà 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.