imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 17.06.2002, 10:55     # 1
Aleksey_M_T
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;
};

Очень хотелось бы получить аргументированное объяснение.
Заранее благодарен.
 
Старый 17.06.2002, 16:28     # 2
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Из твоего кода не очень понятно каким образом и где ты получил sizeof твоей функции ( обращение &C::foo() не пойдет поскольку foo не статик). А вообще, размер любого указателя обычно 4 байта (то бишь DWORD).
alexey_ma вне форума  
Старый 17.06.2002, 18:01     # 3
Aleksey_M_T
Guest
 
Сообщения: n/a

уточнение к вопросу

запись sizeof(&C::foo()) - условная
для точности поясню:

C c;
sizeof(&c.foo()) = ...;

Та размерность, которую я указал, соответствует действительности (это легко проверить).
 
Старый 17.06.2002, 20:47     # 4
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
>>C c;
>>sizeof(&c.foo()) = ...;

Это не размер указателя на функцию.
По порядку:
сначала отрабатывает c.foo() , то есть вызываеться функция foo обьекта с, эта функция возвращает какое-то значение от которого ты получаешь адресс, а потом берешь sizeof от него.

По большому, такой код даже компилироваться не должен поскольку у тебя нет тела функции и возвращаемое значение типа void.

Указателем на функцию ,как известно, являеться ее имя. А запись - c.foo() являеться вызовом этой функции.
alexey_ma вне форума  
Старый 17.06.2002, 20:50     # 5
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
P.S. Ты бы код поподробнее привел, что бы разобраться можно было.

Последний раз редактировалось alexey_ma; 17.06.2002 в 20:53.
alexey_ma вне форума  
Старый 18.06.2002, 13:43     # 6
Aleksey_M_T
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
 
Старый 18.06.2002, 16:18     # 7
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
>>int a = sizeof(&C1::foo);//
То же не совсем корректно. Ты берешь адресс указателя, а от него - sizeof. Наверное правилнее написать
int a = sizeof(C1::foo); Ведь имя функции это уже и есть указатель.
Только копилятор ругаеться, cу...
Но дело даже не в этом. Все равно по правильному даже такая запись(int a = sizeof(&C1::foo); должна возвращать всегда 4. Так-что налицо небольшой глючок. Если сможешь поробуй в каком нибудь другом компиляторе, Borland например.
alexey_ma вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 00:03.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.