Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++中定义一个显式构造函数,但是我会用VTABLE抛出链接错误。p>_C++_Inheritance_Polymorphism - Fatal编程技术网

链接器错误C++;函数表 我试图在C++中定义一个显式构造函数,但是我会用VTABLE抛出链接错误。p>

链接器错误C++;函数表 我试图在C++中定义一个显式构造函数,但是我会用VTABLE抛出链接错误。p>,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,这就是我目前所拥有的 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 Sp

这就是我目前所拥有的

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;
};

谢谢。

问题在于,在
球体
类中,
volume()
surface\u area()
函数仍然未定义。 因此,编译器不会为Sphere类发出任何vtable

如果要保持球体抽象,请将其定义为:

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
(虚拟指针)必须指向某个地方

所以,通过使球体函数成为纯虚拟函数,我可以执行一个越界构造函数调用?但是如果我的函数是纯函数,那么继承将如何进行呢?这是否意味着,如果我们调用球面上的体积函数,它指向哪里?基类还是派生类?我只是想确保我完全理解为什么我们可以这样做。
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){}