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 &rBase
bằngA &rBase
là 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ì
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.