g ++ — неопределенное переполнение стека vtable

#include <stdio.h>

class A {
public:
virtual void print();
A();
};

class B :public A {
public:
void print();
B();
};

class C :public B {
public:
void print();
C();
};

A::A(){
}

B::B(){
}

C::C(){
}

void B::print() {
printf("From B\n");
}

void C::print() {
printf("From C\n");
}

int main() {
B* object = new C;
object->print();

return 0;
}

Когда я пытаюсь скомпилировать этот файл C ++, я получаю следующую ошибку. Не могу понять причину. Я попытался прочитать похожие неопределенные вопросы vtable на SO.

/tmp/ccpOkVJb.o: In function `A::A()':
test1.cpp:(.text+0xf): undefined reference to `vtable for A'
/tmp/ccpOkVJb.o:(.rodata._ZTI1B[_ZTI1B]+0x10): undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status

1

Решение

Если A::print() не должен быть реализован, объявить его чистым:

class A {
public:
virtual void print() = 0;
A();
};

В противном случае, реализовать это.

7

Другие решения

Вы заявляете, что должен быть A::print метод реализован (вы, вероятно, хотели сделать его чисто виртуальным, используя = 0), но вы не реализуете это.

Так как первый реализованный виртуальный метод заставляет компилятор создавать экземпляр vtable, а вы не реализовали ничего в A, vtable A отсутствует, что приводит к undefined reference to 'vtable for A',

3

Вы должны объявить A::print() как чисто виртуальный, или предоставить реализацию:

class A {
public:
virtual void print()=0;
A();
};

или же

class A {
public:
virtual void print() {}
A();
};
2
По вопросам рекламы [email protected]