C++ 无法调用通过两个类继承的虚拟方法
我试图创建一个从另一个类继承的类,而这个类又从另一个抽象类继承,这个抽象类只使用纯虚拟方法:C++ 无法调用通过两个类继承的虚拟方法,c++,C++,我试图创建一个从另一个类继承的类,而这个类又从另一个抽象类继承,这个抽象类只使用纯虚拟方法: // objects.cpp: class Object { public: virtual void generate() = 0; virtual ~Object() = 0; }; class Vehicle: public Object { virtual void generate() = 0; protected: // Attributes inherite
// objects.cpp:
class Object
{
public:
virtual void generate() = 0;
virtual ~Object() = 0;
};
class Vehicle: public Object
{
virtual void generate() = 0;
protected:
// Attributes inherited by Bike objects.
public:
virtual ~Vehicle() = 0;
};
class Bike: public Vehicle
{
private:
// Attributes specific to Bike class objects.
public:
void generate()
{
// Takes the data from the object being called on and writes them to a file.
}
Bike()
{
// Declaring a bike launches the constructor which randomly generates and assigns data.
}
~Bike() {}
};
void trigger_generation(Object & opoint)
{
opoint.generate();
}
下面是头文件:
// objects.hpp
#ifndef OBJECTS_H
#define OBJECTS_H
class Object
{
public:
virtual void generate();
virtual ~Object();
};
class Vehicle: public Object
{
protected:
// Attributes inherited by Bike objects.
public:
virtual ~Vehicle();
};
class Bike: public Vehicle
{
private:
// Attributes specific to Bike class objects.
public:
void generate();
Bike();
~Bike();
};
void trigger_generation(Object & opoint);
#endif // OBJECTS_H
然后,在main.cpp文件中,我对Bike类对象运行generate()方法:
// main.cpp
#include "objects.hpp"
int main(int argc, char *argv[])
{
Bike itsactuallyabicycle;
trigger_generation(itsactuallyabicycle);
}
我最后犯了以下错误:main.cpp:(.text+0x27):对“Bike::Bike()”的未定义引用
main.cpp:(.text+0x3f):对“Bike::~Bike()”的未定义引用
main.cpp:(.text+0x64):未定义对“Bike::~Bike()”的引用。
导致这些错误的原因是什么?如何避免这些错误,以便能够正常调用Bike类方法
<>编辑:使用<代码> G++Me.CPP Obj.HPP对象.CPP < P>纯虚析构函数在C++中是合法的,但必须有一个体。
Object::~Object()
{
}
及
指
类名不能是typedef名称。在构造函数中
声明,可选decl说明符序列中的每个decl说明符
应该是friend、inline、explicit或constexpr。
[ 例如:
struct S {
S(); // declares the constructor
};
S::S() { } // defines the constructor
- 结束示例 ]
将调用hpp
文件中的声明,其中包括:
Bike();
~Bike();
因此,Bike();
和~Bike();
只是声明,而不是定义,导致:
undefined reference to `Bike::Bike()'
undefined reference to `Bike::~Bike()'
你能编辑你在问题中使用的编译器/链接器命令吗?你似乎已经定义了两次类-一次在头文件中,一次在.cpp文件中。这不起作用。你在objects.hpp头文件和objects.cpp源文件中都有你的类的声明。如果你现在在main.cpp文件中拥有所有内容,你可能会更幸运,因为您似乎还没有学会如何将代码拆分为单独的文件。@NeilButterworth-如果定义相同,这会起作用。但是保持两个定义同步将是维护方面的一个难题。我不会将这些
cout
投诉放在析构函数体中。当具体派生类已被销毁。@aschepler,请尊重您的建议和评论。我已修改了我的答案。谢谢:-)我应该在头文件中使用名称空间语法“例如:Bike::Bike(){}”或在cpp文件中定义cons-/destructor吗?我不能只使用一条定义指令吗?
Bike();
~Bike();
undefined reference to `Bike::Bike()'
undefined reference to `Bike::~Bike()'