运算符内的虚方法调用<<

时间:2014-04-10 08:06:05

标签: c++ polymorphism virtual

我的课程很少:

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的用法。有人可以解释一下我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

当你将它的函数field()更改为const时,Circle变为抽象,因为field() const实际上是一种完全不同于field()的方法,这就是为什么field()然后在Circle中保持未定义,因此它是抽象的。

我建议你在override中使用新的C ++ 11-ish关键字Circle::field()来与编译器通信,你实际上打算覆盖虚方法。如果继承类型中的field函数不存在和/或与基类中的任何虚方法兼容,则编译器拒绝编译。