c++ - 使用 c'ctor、d'ctor 和覆盖

标签 c++ class polymorphism overriding

假设我想定义一个名为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 

我不太确定两件事:

  1. 我应该向 Shape 类添加一个 c'tor 和 d'ctor 吗?

    因为据我了解,由于该类是抽象的,因此不需要它们。

  2. 我是否应该将 override 添加到 Circle 中的重写方法中,就像这样?

    virtual double getArea() const override ;
    virtual double getPerim() const override ;
    
  3. 假设我写了以下内容(主要):

    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/

相关文章:

c++ - 文件关闭后如何避免数组中的对象超出范围?

c++ - 用 STL 维护最小堆的简单方法?

android - 使用来自 android 相机硬件实现的硬件编码器

c++ - 是否有 Linux 等效的 SetupDiGetClassDevs 函数

c++ - 在 C++ 中,在销毁指向类的指针后,我可以使用新函数重新利用指针吗

java - scala 中的模式匹配。当参数表现出多态性或者是子类时,会有什么行为::

c# - 界面的可访问性

c++ - 在 Linux 上构建 opencv_contrib 示例可执行文件 (OpenCV 3.0.0-alpha)

C++ 理解类和构造函数

C++ 类和变量