Ошибка: Вызов чисто виртуальной функции ! ?
От: 1234  
Дата: 24.06.04 16:04
Оценка:
Hello!
Зашёл спор, есть люди которые утверждают что бывает такая ошибка.(видел один раз такой мессадж в Нейро Бёрнинг)
Как она может появится если компилятор таки случаи отслеживает.
В часности:
class A
{
    virtual int Foo(int i)=0;
};

class B: public A
{
    virtual int S(int d)
    {
        return 1;
    }
};


пример вызвает ошибку:

error C2259: 'B' : cannot instantiate abstract class
due to following members:
'int A::Foo(int)' : pure virtual function was not defined
Re: Ошибка: Вызов чисто виртуальной функции ! ?
От: Кодт Россия  
Дата: 24.06.04 16:12
Оценка: 3 (1)
Здравствуйте, 1234, Вы писали:

1>Hello!

1>Зашёл спор, есть люди которые утверждают что бывает такая ошибка.(видел один раз такой мессадж в Нейро Бёрнинг)
1>Как она может появится если компилятор таки случаи отслеживает.

Можно опосредованно вызвать виртуальный метод из конструктора/деструктора
struct A
{
  virtual void foo() = 0;
  virtual void bar() = 0;

  void call_foo() { foo(); } // вызов виртуального метода
  void call_bar() { bar(); }

  A() // в этот момент vfptr указывает на VMT класса A, с абстрактными методами
  {
    foo(); // статический вызов
    bar(); // статический вызов --> ошибка линкера
    call_foo(); // бабах!
    call_bar(); // бабах!
  }
};

void A::foo() {}
// абстрактные методы можно определять

struct B : A
{
  void foo() {}
  void bar() {}

  B() // бабах в конструкторе A
  {
    foo(); // статический вызов
    call_foo(); // метод уже не абстрактный
  }
};

main()
{
  A a; // ошибка компилятора: абстрактный класс
  B b;
}
Перекуём баги на фичи!
Re[2]: Ошибка: Вызов чисто виртуальной функции ! ?
От: 1234  
Дата: 24.06.04 16:34
Оценка:
Здравствуйте, Кодт, Вы писали:

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


1>>Hello!

1>>Зашёл спор, есть люди которые утверждают что бывает такая ошибка.(видел один раз такой мессадж в Нейро Бёрнинг)
1>>Как она может появится если компилятор таки случаи отслеживает.

К>Можно опосредованно вызвать виртуальный метод из конструктора/деструктора

К>
К>struct A
К>{
К>  virtual void foo() = 0;
К>  virtual void bar() = 0;

К>  void call_foo() { foo(); } // вызов виртуального метода
К>  void call_bar() { bar(); }

К>  A() // в этот момент vfptr указывает на VMT класса A, с абстрактными методами
К>  {
К>    foo(); // статический вызов
К>    bar(); // статический вызов --> ошибка линкера
К>    call_foo(); // бабах!
К>    call_bar(); // бабах!
К>  }
К>};

К>void A::foo() {}
К>// абстрактные методы можно определять

К>struct B : A
К>{
К>  void foo() {}
К>  void bar() {}

К>  B() // бабах в конструкторе A
К>  {
К>    foo(); // статический вызов
К>    call_foo(); // метод уже не абстрактный
К>  }
К>};

К>main()
К>{
К>  A a; // ошибка компилятора: абстрактный класс
К>  B b;
К>}
К>

Действеитльно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.