IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   размерность указателя на метод класса (http://www.imho.ws/showthread.php?t=6322)

Aleksey_M_T 17.06.2002 10:55

размерность указателя на метод класса
 
Здравствуйте!

Хотел спросить о размерности указателя на функцию.
Я был удивлен результатами, которые выдал 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;
};

Очень хотелось бы получить аргументированное объяснение.
Заранее благодарен.

alexey_ma 17.06.2002 16:28

Из твоего кода не очень понятно каким образом и где ты получил sizeof твоей функции ( обращение &C::foo() не пойдет поскольку foo не статик). А вообще, размер любого указателя обычно 4 байта (то бишь DWORD).

Aleksey_M_T 17.06.2002 18:01

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

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

Та размерность, которую я указал, соответствует действительности (это легко проверить).

alexey_ma 17.06.2002 20:47

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

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

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

Указателем на функцию ,как известно, являеться ее имя. А запись - c.foo() являеться вызовом этой функции.

alexey_ma 17.06.2002 20:50

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

Aleksey_M_T 18.06.2002 13:43

уточнение
 
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

alexey_ma 18.06.2002 16:18

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


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

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