Russian Qt Forum

Программирование => С/C++ => Тема начата: lenny от Февраль 11, 2011, 20:19



Название: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 20:19
Добрый вечер! Собственно вот:
Код:
class A
{
private:
    virtual void virt(){}
};
 
class B: public A
{
public:
    virtual void virt(){}
    int var[100];
};
 
int main(int argc, char *argv[])
{
    A* x = new B;   //Памяти выделили размером A,  
                    //ссылку на vtable получили от B,
                    //да еще и B::virt на которую ссылается
                    //vtable x стал закрытым,
                    //т.е. x->virt(); не будет работать.
}
Правил что-то много получается.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: Fat-Zer от Февраль 11, 2011, 20:38
>> //Памяти выделили размером A,
не правда
                    //да еще и B::virt на которую ссылается
                    //vtable x стал закрытым,
                    //т.е. x->virt(); не будет работать.
что написали то и получили... в классе A должен был бы быть метод в роде этого:
Код
C++ (Qt)
void A::callVirt()
{ virt(); }
 

Как интерпретировать мозгом A* x = new B ?
//.............
Правил что-то много получается.
Ответ 1... разбираться в с++ в частности и в ООП в общем.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 20:59
void A::callVirt()
{ virt(); }
 
Это понятно.
Меня интересует зачем изменяется модификатор доступа именно в том случае? В чем логика?


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: Fat-Zer от Февраль 11, 2011, 21:23
void A::callVirt()
{ virt(); }
 
Это понятно.
Меня интересует зачем изменяется модификатор доступа именно в том случае? В чем логика?
это вопрос к вам... вы же это написали=) и как компилятор должен определять,что метод не private? ведь вся проверка доступа происходит во время компиляции.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 21:45
>> //Памяти выделили размером A,
не правда
А сколько? Проверил, sizeof(*x); вернул 4.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 21:46
ведь вся проверка доступа происходит во время компиляции.
Спасибо!!! Кажется врубился.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 21:48
это вопрос к вам... вы же это написали=)
Логичнее так не делать. Но возможность есть.


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: Fat-Zer от Февраль 11, 2011, 22:09
А сколько? Проверил, sizeof(*x); вернул 4.
выделяется, само собой, sizeof(B), ведь мы создаём объект класса B. чтоб проверить можно заставить virt в классе B возвращать sizeof(*this);
Логичнее так не делать. Но возможность есть.
на первый взглад конструкция бесполезная, но может где-то пригодиться...


Название: Re: Как интерпретировать мозгом A* x = new B ?
Отправлено: lenny от Февраль 11, 2011, 22:42
А сколько? Проверил, sizeof(*x); вернул 4.
выделяется, само собой, sizeof(B), ведь мы создаём объект класса B. чтоб проверить можно заставить virt в классе B возвращать sizeof(*this);
Так и оказалось, sizeof(*this); Вернул свои 404.
Получился эквивалент
Код:
    B* z = new B;
    A* x = z;
, т.е. обычное понижение до предка.
Это получается, что я запутался на пустом месте :o