Здравствуйте, LaptevVV, Вы писали:
LVV>Но, уважаемый Lorenzo, поясните мне неучу, почему аноним считает (и приводит пример), что абстрактный объект создается.
Я так не считаю и примера такого не привожу.
Re[6]: Virtual and Pure Virtual function
От:
Аноним
Дата:
25.08.03 14:31
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>Пардон-с!!! Где ж тут создание есть создание объекта абстракного класса?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, LaptevVV, Вы писали:
LVV>>Но, уважаемый Lorenzo, поясните мне неучу, почему аноним считает (и приводит пример), что абстрактный объект создается.
А>Я так не считаю и примера такого не привожу.
А вы ТОТ аноним?
Значит, пример доказывал создание VMT с нулевой ссылкой, да?
Если так, то и пусть себе. Это, ИМХО, нормально. Я так бы тож делал.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Incidentally, it is possible to provide a definition for a pure virtual function. That is, you could provide an implementation for Shape::draw, and C++ wouldn't complain, but the only way to call it would be to fully specify the call with the class name: ¤ Item E36, P11
Shape *ps = new Shape; // error! Shape is abstract
Shape *ps1 = new Rectangle; // fine
ps1->draw(); // calls Rectangle::draw
Shape *ps2 = new Ellipse; // fine
ps2->draw(); // calls Ellipse::draw
ps1->Shape::draw(); // calls Shape::draw
ps2->Shape::draw(); // calls Shape::draw
LVV>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, LaptevVV, Вы писали:
LVV>>>Но, уважаемый Lorenzo, поясните мне неучу, почему аноним считает (и приводит пример), что абстрактный объект создается.
А>>Я так не считаю и примера такого не привожу. LVV>А вы ТОТ аноним? LVV>Значит, пример доказывал создание VMT с нулевой ссылкой, да? LVV>Если так, то и пусть себе. Это, ИМХО, нормально. Я так бы тож делал.
Здравствуйте, MT, Вы писали:
MT>Incidentally, it is possible to provide a definition for a pure virtual function. That is, you could provide an implementation for Shape::draw, and C++ wouldn't complain, but the only way to call it would be to fully specify the call with the class name: ¤ Item E36, P11 MT>
MT>Shape *ps = new Shape; // error! Shape is abstract
MT>Shape *ps1 = new Rectangle; // fine
ps1->>draw(); // calls Rectangle::draw
MT>Shape *ps2 = new Ellipse; // fine
ps2->>draw(); // calls Ellipse::draw
ps1->>Shape::draw(); // calls Shape::draw
ps2->>Shape::draw(); // calls Shape::draw
MT>
Кажется я эту книжку читал!
Но это я и сам знаю, я проверил же пример анонима. Просто я не обратил внимание на фразу Кодта, о том, что vmt не создается из-за нулевых ссылок. А сыр-бор шел как раз вокруг этого. То есть там под ковром абстрактный объект неявно существует.
А абстрактный объект в явном виде по стандарту создать нельзя. И мои компиляторы в этом месте соответствуют.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Другой Аноним, Вы писали:
ДА>Здравствуйте, LaptevVV, Вы писали:
LVV>>А абстрактный объект в явном виде по стандарту создать нельзя. И мои компиляторы в этом месте соответствуют.
ДА> А вы и компиляторы выпускаете?
Могем! Ось, помнится, написали, могем и компилер слабать. Токмо пока не про С++, а просто С. В С++ плюсов много, одному не поднять.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Кстати, по поводу создания объектов абстрактных классов. Посмотрите такое (у меня сейчас нету под рукой VC6.0 — кто-то как-то на такое вроде жаловался):
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Аноним, Вы писали:
LVV>Пардон-с!!! Где ж тут создание есть создание объекта абстракного класса?
В конструкторе абстрактного класса
class A
{
public:
virtual void pure() = 0;
void call_pure()
{
pure();
}
A() // vfptr = &A::vmt
{
pure(); // здесь - статический вызов;
// если функция не определена, линкер ошибет.
call_pure(); // здесь - динамический вызов;
// поскольку в VMT класса A неизвестно что, то будет undefined behaviour
// (вероятнее всего, там ссылка на функцию выброса исключения)
}
};
class B : public A
{
public:
virtual void pure() { ; }
B()
: A() // vfptr = &A::vmt
// vfptr = &B::vmt
{
pure();
call_pure(); // в данный момент используем уже VMT класса B
}
};
int main()
{
B b;
return 0;
}