C++对 vtable 和继承的未定义引用

发布于 2025-01-08 10:58:40 字数 610 浏览 0 评论 0原文

文件 Ah

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif

文件 Child.h

#ifndef CHILD_H_
#define CHILD_H_

#include "A.h"

class Child: public A {
private:
    int x,y;
public:
    Child();
    ~Child();
    void doWork();
};
#endif

和 Child.cpp

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};

编译器表示 A 存在对 vtable 的未定义引用。 我尝试了很多不同的方法,但没有一个有效。

我的目标是让 A 类成为一个接口,并将实现代码与标头分开。

File A.h

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif

File Child.h

#ifndef CHILD_H_
#define CHILD_H_

#include "A.h"

class Child: public A {
private:
    int x,y;
public:
    Child();
    ~Child();
    void doWork();
};
#endif

And Child.cpp

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};

The compiler says that there is a undefined reference to vtable for A.
I have tried lots of different things and yet none have worked.

My objective is for class A to be an Interface, and to seperate implementation code from headers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

遗失的美好 2025-01-15 10:58:40

为什么会出现错误&如何解决?

您需要提供A 类 中所有虚函数的定义。只允许纯虚函数没有定义。

即:在类A中,两种方法:

virtual ~A();
virtual void doWork();

都应该被定义(应该有一个主体),

例如:

A.cpp

void A::doWork()
{
}
A::~A()
{
}

警告:
如果您希望您的A类充当接口(又名C++ 中的抽象类),那么您应该将该方法设置为纯虚方法。

virtual void doWork() = 0;

好读:

这是什么意思“虚拟表”是一个未解析的外部?
构建 C++ 时,链接器说我的构造函数、析构函数或虚拟表未定义。

Why the error & how to resolve it?

You need to provide definitions for all virtual functions in class A. Only pure virtual functions are allowed to have no definitions.

i.e: In class A both the methods:

virtual ~A();
virtual void doWork();

should be defined(should have a body)

e.g.:

A.cpp

void A::doWork()
{
}
A::~A()
{
}

Caveat:
If you want your class A to act as an interface(a.k.a Abstract class in C++) then you should make the method pure virtual.

virtual void doWork() = 0;

Good Read:

What does it mean that the "virtual table" is an unresolved external?
When building C++, the linker says my constructors, destructors or virtual tables are undefined.

指尖微凉心微凉 2025-01-15 10:58:40

我的目标是让 A 成为一个接口,并将实现代码与标头分开。

在这种情况下,将 A 类中的成员函数设置为纯虚函数。

class A {
  // ...
  virtual void doWork() = 0;
};

My objective is for A to be an Interface, and to seperate implementation code from headers.

In that case, make the member function as pure virtual in class A.

class A {
  // ...
  virtual void doWork() = 0;
};
风透绣罗衣 2025-01-15 10:58:40

如果其他答案都无法帮助您,请确保删除所有“*.gch”文件。

Make sure to delete any "*.gch" files if none of the other responses help you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文