Re[8]: Virtual and Pure Virtual function
От: Аноним  
Дата: 25.08.03 14:30
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Но, уважаемый Lorenzo, поясните мне неучу, почему аноним считает (и приводит пример), что абстрактный объект создается.


Я так не считаю и примера такого не привожу.
Re[6]: Virtual and Pure Virtual function
От: Аноним  
Дата: 25.08.03 14:31
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Пардон-с!!! Где ж тут создание есть создание объекта абстракного класса?


Нигде. А что, кто-то утверждал, что есть?
Re[9]: Virtual and Pure Virtual function
От: LaptevVV Россия  
Дата: 25.08.03 14:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, LaptevVV, Вы писали:


LVV>>Но, уважаемый Lorenzo, поясните мне неучу, почему аноним считает (и приводит пример), что абстрактный объект создается.


А>Я так не считаю и примера такого не привожу.

А вы ТОТ аноним?
Значит, пример доказывал создание VMT с нулевой ссылкой, да?
Если так, то и пусть себе. Это, ИМХО, нормально. Я так бы тож делал.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[10]: Virtual and Pure Virtual function
От: MT  
Дата: 25.08.03 14:46
Оценка:
Vot, nashel koe chto:

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>Если так, то и пусть себе. Это, ИМХО, нормально. Я так бы тож делал.
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re[10]: Virtual and Pure Virtual function
От: Другой Аноним  
Дата: 25.08.03 14:52
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

LVV>А вы ТОТ аноним?


Тот самый.
Re[11]: Virtual and Pure Virtual function
От: LaptevVV Россия  
Дата: 25.08.03 14:53
Оценка:
Здравствуйте, 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 не создается из-за нулевых ссылок. А сыр-бор шел как раз вокруг этого. То есть там под ковром абстрактный объект неявно существует.
А абстрактный объект в явном виде по стандарту создать нельзя. И мои компиляторы в этом месте соответствуют.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[12]: Virtual and Pure Virtual function
От: Другой Аноним  
Дата: 25.08.03 14:58
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

LVV>А абстрактный объект в явном виде по стандарту создать нельзя. И мои компиляторы в этом месте соответствуют.


А вы и компиляторы выпускаете?
Re[13]: Virtual and Pure Virtual function
От: LaptevVV Россия  
Дата: 25.08.03 15:01
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

ДА>Здравствуйте, LaptevVV, Вы писали:


LVV>>А абстрактный объект в явном виде по стандарту создать нельзя. И мои компиляторы в этом месте соответствуют.


ДА> А вы и компиляторы выпускаете?

Могем! Ось, помнится, написали, могем и компилер слабать. Токмо пока не про С++, а просто С. В С++ плюсов много, одному не поднять.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[14]: Virtual and Pure Virtual function
От: Lorenzo_LAMAS  
Дата: 26.08.03 07:16
Оценка:
Кстати, по поводу создания объектов абстрактных классов. Посмотрите такое (у меня сейчас нету под рукой VC6.0 — кто-то как-то на такое вроде жаловался):
//ill-formed program
class Abstr
{
public:
    virtual void fun()const = 0;
};

class NonAbstr:public Abstr
{
public:
     void fun()const{}
};

NonAbstr fun()
{
    return NonAbstr();
}

void LajaFun()
{
    const Abstr & rbase = fun();

    throw rbase;
}


Если не ошибаюсь, вижуал такое компилит — правда, как и что там дальше я не знаю.
Of course, the code must be complete enough to compile and link.
Re[6]: Virtual and Pure Virtual function
От: Кодт Россия  
Дата: 26.08.03 07:35
Оценка: +1
Здравствуйте, 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;
}
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.