【问题标题】:C++ Constructor Inheritance of CircleCircle的C++构造函数继承
【发布时间】:2016-11-19 23:12:37
【问题描述】:

我的圆形构造函数有问题,它继承自 Point2D 类。

shape.h

 #pragma once
 class Shape {
    public:
      virtual float area() const = 0;

      virtual float circumference() const = 0;
  };

Point2D.h

#pragma once
#include "Shape.h"

template<class T>
class Point2D : public Shape {
  protected:
      T x, y;
  public:

    Point2D() : x(0), y(0) { }

    Point2D(T x, T y) : x(x), y(y) { }

    T getX() const;

    T getY() const;

    void setX(T x);

    void setY(T y);


};

template<class T>
T Point2D<T>::getX() const {
    return x;
}

template<class T>
T Point2D<T>::getY() const {
    return y;
}

template<class T>
void Point2D<T>::setX(T x) {
    Point2D<T>::x = x;
}

template<class T>
void Point2D<T>::setY(T y) {
    Point2D<T>::y = y;
}

Circle.h

#pragma once
#include "Point2D.h"
#include "CustomException.h"

template<class T>
class Circle: public Point2D<T> {
  protected:
    T x, y, radius;
  public:

    Circle() : x(0), y(0), radius(0){}

    Circle(T x, T y, T radius) : Point2D<T>(x,y), radius(radius) { }

    T getRadius() const;

    void setRadius(T radius);

    virtual float area();

    virtual float circumference();


};

template<class T>
T Circle<T>::getRadius() const {
  return radius;
}

template<class T>
void Circle<T>::setRadius(T radius) {
  Circle<T>::radius = radius;
}

template<class T>
float Circle<T>::area() {
  return 3.14*radius*radius;
}

template<class T>
float Circle<T>::circumference() {
  return 3.14*2*radius;
}

我收到以下错误:

error: invalid new-expression of abstract class type ‘Circle<int>’
Circle<int> *circleInt = new Circle<int>(2, 2, 4);

because the following virtual functions are pure within ‘Circle<int>’:
class Circle: public Point2D<T> {
  virtual float Shape::area() const
  virtual float area() const = 0;
  virtual float Shape::circumference() const
  virtual float circumference() const = 0;

为什么会出现这些错误?我该如何解决这个问题?

【问题讨论】:

  • 您实际上并没有覆盖Point2D 类的虚方法,而是创建了没有const 限定符的新方法。 (C++11 添加了override 关键字,可以让您更容易地发现该错误)

标签: c++ inheritance constructor


【解决方案1】:

刚刚收到!由于我需要覆盖 shape.h 中的虚方法 area() 和 circle(),因此 area() 和 circle() 的方法需要改变。而且他们总是需要更改为常量方法。

 virtual float area(); >>>>>> float area() const override;
 virtual float circumference; >>>>>> float area() const override;

【讨论】:

  • 只要记住以下规则:1)只要你的类中有没有实现的虚函数,你就有一个抽象类,2)new不能与抽象类一起使用,3)无论何时你继承了这样一个抽象类,你也继承了未实现的虚函数。如果您不覆盖这些并提供实现,您的派生类也将成为抽象类。
猜你喜欢
  • 2019-01-21
  • 2017-08-09
  • 2012-11-14
  • 2021-06-24
  • 2015-03-24
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多