PDA

Просмотр полной версии : размерность указателя на метод класса


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 например.