Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法调用通过两个类继承的虚拟方法_C++ - Fatal编程技术网

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()'