Bạn có thể tưởng tượng được mã này:
struct A {
void f() {}
int int_in_b1;
};
int main() {
A a;
a.f();
return 0;
}
Bị biến thành một cái gì đó như:
struct A {
int int_in_b1;
};
void A__f(A* const this) {}
int main() {
A a;
A__f(&a);
return 0;
}
Calling f là chuyển tiếp thẳng vì nó không phải ảo. (Và đôi khi cho các cuộc gọi ảo, các công văn ảo có thể tránh được nếu các loại động của đối tượng được biết đến, vì nó là ở đây.)
Một ví dụ nữa mà một trong hai sẽ cung cấp cho bạn một ý tưởng về cách chức năng ảo làm việc hoặc khủng khiếp nhầm lẫn bạn:
struct B {
virtual void foo() { puts(__func__); }
};
struct D : B {
virtual void foo() { puts(__func__); }
};
int main() {
B* a[] = { new B(), new D() };
a[0]->foo();
a[1]->foo();
return 0;
}
trở thành một cái gì đó như:
void B_foo(void) { puts(__func__); }
void D_foo(void) { puts(__func__); }
struct B_VT {
void (*foo)(void);
}
B_vtable = { B_foo },
D_vtable = { D_foo };
typedef struct B {
struct B_VT* vt;
} B;
B* new_B(void) {
B* p = malloc(sizeof(B));
p->vt = &B_vtable;
return p;
}
typedef struct D {
struct B_VT* vt;
} D;
D* new_D(void) {
D* p = malloc(sizeof(D));
p->vt = &D_vtable;
return p;
}
int main() {
B* a[] = {new_B(), new_D()};
a[0]->vt->foo();
a[1]->vt->foo();
return 0;
}
Mỗi đối tượng chỉ có một con trỏ vtable, và bạn có thể thêm nhiều phương thức ảo vào lớp mà không ảnh hưởng đến kích thước đối tượng. (Vtable phát triển, nhưng điều này được lưu trữ một lần cho mỗi lớp và không phải là kích thước đáng kể.) Lưu ý rằng tôi đã đơn giản hóa nhiều chi tiết trong ví dụ này, nhưng nó does work: destructors không được giải quyết (mà nên thêm ảo ở đây), nó rò rỉ bộ nhớ và các giá trị __func__ sẽ hơi khác (chúng được tạo bởi trình biên dịch cho tên của hàm hiện tại), trong số các giá trị khác.
Nguồn
2010-03-11 06:48:17
Tôi đề nghị 'Bên trong Mô hình đối tượng C++' của Stanley Lippman nếu bạn muốn các đối tượng C++ có thể được mô hình hóa như thế nào (tôi nói có thể vì có nhiều cách để thực hiện nội bộ C++). –
Nếu bạn sửa mã của mình, tại sao không chạy trình biên dịch của bạn với đầu ra của trình lắp ráp và xem nó tạo ra cái gì? –