【发布时间】: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