假设我想定义一个名为Circle
的类,它具有计算其面积和周长的方法。此类使用另一个名为 Point
的类。还假设此类继承自名为 Shape
的抽象类。
所以,我写了下面的代码:
圆.h
#ifndef Circle_h
#define Circle_h
#include "Point.h"
#include "Shape.h"
class Circle : public Shape
{
public:
Circle(const Point &ceneter , int radius);
~Circle();
virtual double getArea() const ;
virtual double getPerim() const ;
private:
int radius;
Point center;
};
#endif
形状.h
#ifndef Shape_h
#define Shape_h
#include "Point.h"
#include <iostream>
class Shape //abstract class//
{
public:
virtual double getArea() const=0;
virtual double getPerim() const=0;
};
#endif
点.h
#ifndef Point_h
#define Point_h
class Point
{
public:
Point(int x, int y);
~Point();
int getX() const;
int getY() const;
void setX(int x);
void setY(int y);
private:
int x, y;
};
#endif
我不太确定两件事:
我应该向
Shape
类添加一个 c'tor 和 d'ctor 吗?因为据我了解,由于该类是抽象的,因此不需要它们。
我是否应该将
override
添加到Circle
中的重写方法中,就像这样?virtual double getArea() const override ; virtual double getPerim() const override ;
假设我写了以下内容(主要):
Point o(0, 0); Point a(0, 1); Point b(1, 0); Shape *shapes[] = { new Circle(a, 2), new Circle(b,3), new Circle(o, 1 };
最后一行对使用(或不使用)c'tor 和 d'tor 的需求有何影响?
最佳答案
您的 Shape
类不需要构造函数,但建议给它一个虚拟
构造函数:
class Shape {
public:
virtual ~Shape() = default;
// ...
};
如果没有这个 virtual
析构函数,通过指向 Shape
的指针delete
一个对象是未定义的行为:具体类型不能是动态类型Shape
但是当 dtor 不是 virtual
时,通过具有不同静态类型的指针删除
对象是未定义的行为。
关于override
的使用,我推荐使用它!虽然在您展示的简单示例中它可能无关紧要,但随着类层次结构的增长,它会变得相关。任何成功的软件都会增长,并且会添加虚拟
功能,并且代码清晰有助于维护。 ...我更愿意为成功做好计划。
关于c++ - 使用 c'ctor、d'ctor 和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913386/