gpt4 book ai didi

c++ - 链接器错误 C++ vtable

转载 作者:行者123 更新时间:2023-11-28 04:53:13 25 4
gpt4 key购买 nike

我试图在 C++ 中定义一个显式构造函数,但我在 vtable 中抛出了一个链接器错误。

这是我目前的情况

class Sphere : public Circular{
public:
Sphere(double r);
string name() const {return "Sphere";}
double volume() const;
double surface_area() const;
};

Sphere:: Sphere(double r): Circular(r){}

这是错误给我的:

  "vtable for Sphere", referenced from:
Sphere::Sphere(double) in main.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

但是如果我像这样内联:

class Sphere : public Circular{
public:
Sphere(double r):Circular(r){} <--
string name() const {return "Sphere";}
double volume() const;
double surface_area() const;
};

然后它不会抛出任何错误。这是我的 Circular 类和 GeometricSolid 类供引用:

class GeometricSolid{
public:
virtual string name() const = 0;
virtual double volume() const = 0;
virtual double surface_area() const = 0;
virtual ~GeometricSolid(){};
};
class Circular : public GeometricSolid{
protected:
double radius;
public:
virtual string name() const = 0;
virtual double volume() const = 0;
virtual double surface_area() const =0;
Circular(double r);

};

谢谢。

最佳答案

问题是在您的 Sphere 类中,函数 volume()surface_area() 仍未定义。因此,编译器不会为 Sphere 类发出任何 vtable。

如果你想保持 Sphere 抽象,就这样定义它:

class Sphere : public Circular{
public:
Sphere(double r);
string name() const {return "Sphere";}
virtual double volume() const = 0;
virtual double surface_area() const = 0;
};

Sphere::Sphere(double r): Circular(r){}

否则请提供这些函数的定义。

背后的原因是 vtable 中的 vptr(虚拟指针)必须指向某处。

关于c++ - 链接器错误 C++ vtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47733272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com