我的课程很少:
class Shape{
/* ... */
public:
virtual double field() = 0;
virtual double circumference() = 0;
};
class Circle: public Shape{
protected:
Point center;
double R;
public:
Shape(Point &p1, double R){
this->center=p1;
this->R = R;
}
double field(){
return M_PI *this->R * this->R;
}
double circumference(){
return 2* M_PI * this->R;
}
friend ostream & operator<<(ostream &ostr, const Circle &f);
};
朋友重载运算符是:
ostream & operator<<(ostream &ostr, const Circle &f){
ostr<<"Radius: "<<f.R<<endl;
ostr<<"Circumference: "<<f.circumference()<<endl;
ostr<<"Field: "<<f.field()<<endl;
return ostr;
}
主要代码包含:
/* ... */
Point p = {0,0};
Circle c = Circle(p, 10);
cout<<c;
错误在ovefloaded operator<<
内:
传递&#39; const Circle&#39;作为&#39;这个&#39;虚拟双圈的参数Circle :: field()&#39;
但是当我将double field(){
更改为double field() const{
时,我得到了:
无法分配抽象类型的对象&#39; Circle&#39;
我想我不完全理解virtual
的用法。有人可以解释一下我做错了什么吗?
答案 0 :(得分:1)
当你将它的函数field()更改为const时,Circle变为抽象,因为field() const
实际上是一种完全不同于field()
的方法,这就是为什么field()
然后在Circle
中保持未定义,因此它是抽象的。
我建议你在override
中使用新的C ++ 11-ish关键字Circle::field()
来与编译器通信,你实际上打算覆盖虚方法。如果继承类型中的field
函数不存在和/或与基类中的任何虚方法兼容,则编译器拒绝编译。