C ++虚拟继承 - 覆盖虚函数""很暧昧

时间:2018-01-13 11:52:39

标签: c++ inheritance

我有一个虚拟继承示例,如下所示:

class Polygon {
public:
    virtual double area() = 0;
};

class Rectangle : public virtual Polygon {
    double a, b;
public:
    Rectangle(double a, double b) {
        this->a = a;
        this->b = b;
    }
    double area() { return a * b; }
};

class Rombus : public virtual Polygon {
    double a, h;
public:
    Rombus(double a, double h) {
        this->a = a;
        this->h = h;
    }
    double area() { return a * h; }
};

class Square : public Rectangle, public Rombus {
public:
    Square(double a) : Rectangle(a, a), Rombus(a, a)  {}
};

这是Suare必须从Rectangle和Rombus继承的要求之一。这就是我使用虚拟继承的原因。 但后来我收到了一个错误:

override of virtual function "Polygon::area" is ambiguous
'Square': ambiguous inheritance of 'double Polygon::area(void)'

我做错了什么?

1 个答案:

答案 0 :(得分:3)

错误消息是:

  

' Square':双重Polygon :: area(void)'

的模糊继承

显而易见的原因是:有两种实现方式!

double area() { return a * b; } // in Rectangle
double area() { return a * h; } // in Rhombus

Square继承了它们,因此编译器无法知道使用哪种方法。

你可以修复"它也会覆盖area()中的Square

这种设计从一开始就有缺陷:Square应该只包含一个成员,它的宽度/高度。但是你的成员包含四个成员,所有成员总是具有相同的价值!