对派生类的未定义引用

Jef*_*eff 4 c++ constructor undefined-reference

编辑:与`vtable相关的c ++未定义引用

我试图做一个继承项目,我收到这个错误:

/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
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

main.cpp中:

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

int main() {
    Derived intList(25);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Derived.cpp:

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

using namespace std;

Derived::Derived (int size)
        :Base(size){
}
Run Code Online (Sandbox Code Playgroud)

是什么导致这个错误?看起来我无法调用构造函数,但它看起来很好.

编辑:我尝试了第一个解决方案.现在出错:

/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
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 7

您已经声明了一个虚拟析构函数Base,但您从未定义它.它需要在Derived(以及Base因为它不是纯虚函数)中定义,因为它将在main退出时被调用.你应该有:

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

Base::~Base() {}

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

Derived::~Derived() { /* whatever */ }
Run Code Online (Sandbox Code Playgroud)

这至少是你的一个错误的原因.我不知道这个是不是红鲱鱼,但似乎是:

/tmp/ccw1aT69.o:函数main': main.cpp:(.text+0x15): undefined reference toDerived :: Derived(int)'

你定义Derived::Derived(int),所以很难想象这是一个真正的错误.定义你的析构函数,看看它是否会消失.