Russian Qt Forum
Ноябрь 24, 2024, 00:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как интерпретировать мозгом A* x = new B ?  (Прочитано 3747 раз)
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(); не будет работать.
}
Правил что-то много получается.
Записан
Fat-Zer
Гость
« Ответ #1 : Февраль 11, 2011, 20:38 »

>> //Памяти выделили размером A,
не правда
                    //да еще и B::virt на которую ссылается
                    //vtable x стал закрытым,
                    //т.е. x->virt(); не будет работать.
что написали то и получили... в классе A должен был бы быть метод в роде этого:
Код
C++ (Qt)
void A::callVirt()
{ virt(); }
 

Как интерпретировать мозгом A* x = new B ?
//.............
Правил что-то много получается.
Ответ 1... разбираться в с++ в частности и в ООП в общем.
Записан
lenny
Гость
« Ответ #2 : Февраль 11, 2011, 20:59 »

void A::callVirt()
{ virt(); }
 
Это понятно.
Меня интересует зачем изменяется модификатор доступа именно в том случае? В чем логика?
Записан
Fat-Zer
Гость
« Ответ #3 : Февраль 11, 2011, 21:23 »

void A::callVirt()
{ virt(); }
 
Это понятно.
Меня интересует зачем изменяется модификатор доступа именно в том случае? В чем логика?
это вопрос к вам... вы же это написали=) и как компилятор должен определять,что метод не private? ведь вся проверка доступа происходит во время компиляции.
Записан
lenny
Гость
« Ответ #4 : Февраль 11, 2011, 21:45 »

>> //Памяти выделили размером A,
не правда
А сколько? Проверил, sizeof(*x); вернул 4.
« Последнее редактирование: Февраль 11, 2011, 21:50 от lenny » Записан
lenny
Гость
« Ответ #5 : Февраль 11, 2011, 21:46 »

ведь вся проверка доступа происходит во время компиляции.
Спасибо!!! Кажется врубился.
« Последнее редактирование: Февраль 11, 2011, 21:51 от lenny » Записан
lenny
Гость
« Ответ #6 : Февраль 11, 2011, 21:48 »

это вопрос к вам... вы же это написали=)
Логичнее так не делать. Но возможность есть.
Записан
Fat-Zer
Гость
« Ответ #7 : Февраль 11, 2011, 22:09 »

А сколько? Проверил, sizeof(*x); вернул 4.
выделяется, само собой, sizeof(B), ведь мы создаём объект класса B. чтоб проверить можно заставить virt в классе B возвращать sizeof(*this);
Логичнее так не делать. Но возможность есть.
на первый взглад конструкция бесполезная, но может где-то пригодиться...
Записан
lenny
Гость
« Ответ #8 : Февраль 11, 2011, 22:42 »

А сколько? Проверил, sizeof(*x); вернул 4.
выделяется, само собой, sizeof(B), ведь мы создаём объект класса B. чтоб проверить можно заставить virt в классе B возвращать sizeof(*this);
Так и оказалось, sizeof(*this); Вернул свои 404.
Получился эквивалент
Код:
    B* z = new B;
    A* x = z;
, т.е. обычное понижение до предка.
Это получается, что я запутался на пустом месте Шокированный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.145 секунд. Запросов: 21.