我正在为学校制作一个小程序。我想在类'IObject','Square'和'RotatedSquare'中添加虚拟析构函数。但是当我这样做时,它会出错。在这种情况下是不可能的,或者在这里怎么做?这是我的代码:
interface iobject:
#ifndef IOBJECT_H_
#define IOBJECT_H_
#include "Point.h"
class IObject {
public:
virtual const Point& getPosition()const = 0;
virtual double getSize()const = 0;
//virtual ~IObject();
};
#endif
班级广场
#ifndef SQUARE_H_
#define SQUARE_H_
#include "IObject.h"
#include "Point.h"
#include <iostream>
class Square : public IObject{
private:
Point position;
double size;
public:
Square(const Point& position, const double size):position(position),size(size){};
virtual const Point& getPosition() const {return this->position;}
virtual double getSize() const {return this->size;}
friend std::ostream& operator<<(std::ostream& out, const Square& s);
//virtual ~Square();
protected:
virtual void print(std::ostream& out) const;
};
#endif
类RotatedSquare
#ifndef ROTATEDSQUARE_H_
#define ROTATEDSQUARE_H_
#include "Square.h"
class RotatedSquare : public Square{
private:
double angle;
public:
RotatedSquare(const Point& position, const double size, const double angle): Square(position,size),angle(angle){};
double getAngle() const {return this->angle;}
//virtual ~RotatedSquare();
protected:
virtual void print(std::ostream& out) const;
};
#endif
错误:
Undefined symbols for architecture x86_64:
"Square::~Square()", referenced from:
_main in Practice.o
"vtable for RotatedSquare", referenced from:
RotatedSquare::RotatedSquare(Point const&, double, double) in Practice.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for Square", referenced from:
Square::Square(Point const&, double) in Practice.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for IObject", referenced from:
IObject::IObject() in Practice.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
主要班级:
#include <iostream>
#include "Point.h"
#include "IObject.h"
#include "Square.h"
#include "RotatedSquare.h"
int main() {
IObject* s1 = new Square(Point(1,4),2.2);
std::cout << s1->getPosition() << std::endl;
std::cout << s1->getSize() << std::endl;
Square s2 = Square(Point(4,5),5);
Square* s3 = new RotatedSquare(Point(5,5),8,60);
std::cout << s2 << std::endl;
std::cout << *s3;
return 0;
}
答案 0 :(得分:2)
您需要定义您声明的每个虚拟析构函数。假设您不希望析构函数执行超过默认行为,您可以使用声明进行定义: 而不是:
virtual ~IObject();
使用
virtual ~IObject() {}
如果你想在析构函数中做大量的工作,或者通常更喜欢cpp而不是hpp中的所有定义,那么在cpp文件中定义析构函数(保持hpp中没有定义的声明)
IObject::~IObject()
{
// Whatever needs to be done
}
答案 1 :(得分:0)
您需要在代码中定义虚拟析构函数。 正如您的错误中明确提到的那样。
"Square::~Square()", referenced from:
_main in Practice.o
"vtable for RotatedSquare", referenced from:
RotatedSquare::RotatedSquare(Point const&, double, double) in Practice.o
注意:缺少的vtable通常表示第一个非内联虚拟成员 功能没有定义。
写virtual ~IObject() {}
就足够了。
答案 2 :(得分:0)
你的析构函数缺少定义。
如果您不想提供自己的:
,可以使用编译器生成的编译器virtual ~X() = default;
这比提供一个空体更好:
virtual ~X() { }
因为用户提供的 1 析构函数阻止该类成为trivially destructible。
1 { /* anything */ }
使用户提供,= default
没有。