Неопределенная ссылка на производный класс

РЕДАКТИРОВАТЬ: СВЯЗАНО С c ++ неопределенная ссылка на `vtable

Я пытаюсь сделать проект по наследованию, и я получаю эту ошибку:

/tmp/ccw1aT69.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
/tmp/ccw1aT69.o: In function `Derived::~Derived()':
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x13): undefined reference to `vtable for Derived'
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x1f): undefined reference to `Base::~Base()'
collect2: ld returned 1 exit status

Это мой код:

main.cpp:

#include <iostream>
#include "Base.h"#include "Derived.h"
int main() {
Derived intList(25);
}

base.h:

#ifndef BASE_H
#define BASE_H

class Base {
public:
...
Base (const Base& otherList);
virtual ~Base();
protected:
int *list;
int length;
int maxSize;
};

#endif

Base.cpp:

#include "Base.h"#include <iostream>

using namespace std;

...definitions of my members...

Base::Base (int size) {
//stuff
}
Base::~Base() {
delete [] list;
}
Base::Base (const Base& otherList) {
//stuff
}

Derived.h:

#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"
class Derived: public Base {
public:
...
Derived (int size = 100);
~Derived(); //THIS LINE ADDED AFTER FIRST ANSWER
};

#endif

Derived.cpp:

#include "Derived.h"#include <iostream>

using namespace std;

Derived::Derived (int size)
:Base(size){
}

Что вызывает эту ошибку? Похоже, я не могу вызвать конструктор, но для меня это выглядит нормально.

РЕДАКТИРОВАТЬ: я попробовал первое решение. Ошибка сейчас:

/tmp/ccA4XA0B.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
main.cpp:(.text+0x21): undefined reference to `Derived::~Derived()'
collect2: ld returned 1 exit status

4

Решение

Вы объявили виртуальный деструктор в BaseТем не менее, вы никогда не определяете это. Это должно быть определено в Derived (а также в Base потому что это не чисто виртуальная функция) потому что она будет вызываться один раз main выходы. У тебя должно быть:

class Base {
public:
// ...
virtual ~Base();
};

Base::~Base() {}

class Derived : public Base {
public:
// ...
~Derived();
};

Derived::~Derived() { /* whatever */ }

Это является причиной как минимум одной из ваших ошибок. Я не знаю, красная ли это сельдь или нет, но, похоже, это:

/tmp/ccw1aT69.o: в функции main':
main.cpp:(.text+0x15): undefined reference to
Derived :: Derived (интермедиат)»

Вы определяете Derived::Derived(int)Поэтому трудно представить, что это настоящая ошибка. Определите свой деструктор и посмотрите, исчезнет ли он.

7

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

Хорошо, просто для ясности, и так как я не могу поместить отформатированный код ни в чем, кроме ответа. Вам НЕ нужно предоставлять деструктор в производном классе только потому, что в вашем базовом классе есть виртуальный dtor или чистые методы. Следующее настолько просто, насколько я могу продемонстрировать это в трех различных условиях конструирования / разрушения. вывод указан после кода. Надеюсь, это поможет @Jeff. Я проверил это под VS2005 / 2008/2010 и древним gcc 4.1.2, так что лучше быть правым.

#include <iostream>

class Base {
public:
Base()
{ std::cout << "Base()" << std::endl; };

virtual void call_me() = 0;

virtual ~Base()
{ std::cout << "~Base()" << std::endl << std::endl; };
};

class Derived : public Base {
public:
Derived(int i=1)
{ std::cout << "Derived(" << i << ")" << std::endl; }

// Base::call_me requirements.
void call_me()
{ std::cout << "call_me()" << std::endl; }
};

int main(int argc, char* argv[])
{
// use derived class pointer type
Derived* pDerived = new Derived();
pDerived->call_me();
delete pDerived;

// use base class pointer type
Base* pBase = new Derived(2);
pBase->call_me();
delete pBase;

// scope based
{
Derived obj(3);
obj.call_me();
}
return 0;
}

Выход для этого:

Base()
Derived(1)
call_me()
~Base()

Base()
Derived(2)
call_me()
~Base()

Base()
Derived(3)
call_me()
~Base()
3

main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'

Это сообщение об ошибке не говорит неопределенную ссылку на учебный класс как говорит вопрос о вашем названии. Скорее это жалуется на неопределенную ссылку на конструктор который принимает параметр int. Из моего беглого взгляда на ваш код, вы только объявили этот конструктор и не определили его. Добавьте определение в ваш файл .cpp, и вы должны решить эту ошибку.

Кроме того, обычной практикой является размещение объявлений конструктора перед всеми объявлениями функций-членов. Сначала я пропустил эти заявления, потому что они были не там, где я ожидал. Я настоятельно рекомендую вам сделать это, чтобы избежать недопонимания в будущем, когда вы будете задавать вопросы здесь.

0
По вопросам рекламы [email protected]