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;
}
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 

nên A có virtual thì C, D cũng virtual nốt. Vì nếu không thì
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?