Ошибка линковки.

Slavaga

 

class A
{
public:
  void func1 {return;};
  virtual void func2;
};
class B : public A
{
public:
  void func2 {return;};
};
main
{
  B * b = new B;
  b->func2; //Извините, описался =)
}
 
В итоге линкер грит, что не может найти тело функции A::func2.
Нахуя она ему нужна, если она объявлена как virtual?!
Что делаю неправильно?

okunek

как ты это умудрился скомпилить?

Slavaga

Я это не компилировал =)
Это абстракция.

okunek

Ну тогда пость код, который ты компилил.

Slavaga

А этот-то чем тебе не нравиться?

evgen5555

Перлы типа

B = new B;

поддерживаются, на самом деле

okunek

B->func2;
но вот это точно нет

Slavaga

Исправил

evgen5555

И в исходниках тоже?

Slavaga

В исходниках все нормально было

evgen5555

Кароч, если сам не разрулил ещё, на всякий случай скажу, что функция виртуальная, но не чисто.

kokoc88

virtual void func2;
virtual void func2 = 0;
Как уже отметил г-н Асет...

mira-bella


class A
{
public:
void func1 {return;};
virtual void func2;
};
class B : public A
{
public:
void func2 {return;};
};
main
{
B * b = new B;
b->func2; //Извините, описался =)
}

В итоге линкер грит, что не может найти тело функции A::func2.
Нахуя она ему нужна, если она объявлена как virtual?!
Именно потому очевидно и нужна, что объявлена как virtual: ее адрес должен быть помещен в таблицу виртуальных функций, которая присутствует и в потомках (B). Каким же образом тебе линкер узнает ее адрес (чтобы поместить в таблицу если тело отсутствует?

mira-bella

virtual void func2 = 0;
C чего ты решил, что автор желает сделать абстрактным класс A?

evgen5555

Абстрактным

mira-bella

Абстрактным
ну да, типа того
исправил

Slavaga

C чего ты решил, что автор желает сделать абстрактным класс A?
Все нормально, он должен был быть абстрактным.
Всем спасибо .
Оставить комментарий
Имя или ник:
Комментарий: