xem xét như sau:
#include <iostream>
class A {
public:
virtual void foo(){ std::cout << "A::foo" << std::endl; }
void bar(){ std::cout << "A::bar" << std::endl; }
};
class B : public A {
public:
void foo(){ std::cout << "B::foo" << std::endl; }
void bar(){ std::cout << "B::bar" << std::endl; }
};
int main() {
a_func_ptr f = &A::foo;
a_func_ptr g = &A::bar;
B b;
A a;
(b.*f)();
(b.*g)();
(a.*f)();
(a.*g)();
}
Output:
B::foo
A::bar
A::foo
A::bar
Cả hai con trỏ thành viên là cùng loại, nhưng cả hai chuyển một cách chính xác các cuộc gọi trong mọi trường hợp.
Bằng cách nào đó, chương trình được tạo ra phải biết khi một con trỏ đến phương pháp thực sự là một phương pháp đơn giản hoặc một ảo một. Do đó, biểu diễn thời gian chạy của một con trỏ phương thức phải bao gồm nhiều thông tin hơn để xử lý trường hợp thứ hai.
Lưu ý: kích thước dường như phụ thuộc vào việc triển khai (tôi nhận được 8
trên hệ thống của mình).
Đó là [vì điều này] (http://stackoverflow.com/a/13875868/335858). – dasblinkenlight