imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
размерность указателя на метод класса
Здравствуйте!
Хотел спросить о размерности указателя на функцию. Я был удивлен результатами, которые выдал VC++(6.0 и .net): class A { void foo(); }; class B { void foo(); }; class C : A { void foo(); //sizeof(&C::foo()) = 4; }; class C : A, B { void foo(); //sizeof(&C::foo()) = 8; }; class C : A, virtual B { void foo(); //sizeof(&C::foo()) = 12; }; Очень хотелось бы получить аргументированное объяснение. Заранее благодарен. |
![]() |
# 4 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
>>C c;
>>sizeof(&c.foo()) = ...; Это не размер указателя на функцию. По порядку: сначала отрабатывает c.foo() , то есть вызываеться функция foo обьекта с, эта функция возвращает какое-то значение от которого ты получаешь адресс, а потом берешь sizeof от него. По большому, такой код даже компилироваться не должен поскольку у тебя нет тела функции и возвращаемое значение типа void. Указателем на функцию ,как известно, являеться ее имя. А запись - c.foo() являеться вызовом этой функции. |
![]() |
![]() |
# 6 |
Guest
Сообщения: n/a
|
уточнение
class A
{ public: void foo(); }; class B { public: void foo(); }; class C1 : A { public: void foo(); }; class C2 : A, B { public: void foo(); }; class C3 : A, virtual B { public: void foo(); }; int a = sizeof(&C1::foo);//4 a = sizeof(&C2::foo);//8 a = sizeof(&C3::foo);//12 |
![]() |
# 7 |
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
>>int a = sizeof(&C1::foo);//
То же не совсем корректно. Ты берешь адресс указателя, а от него - sizeof. Наверное правилнее написать int a = sizeof(C1::foo); Ведь имя функции это уже и есть указатель. Только копилятор ругаеться, cу... Но дело даже не в этом. Все равно по правильному даже такая запись(int a = sizeof(&C1::foo); должна возвращать всегда 4. Так-что налицо небольшой глючок. Если сможешь поробуй в каком нибудь другом компиляторе, Borland например. |
![]() |