我有一个虚拟继承示例,如下所示:
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)'
我做错了什么?
答案 0 :(得分:3)
错误消息是:
' Square':双重Polygon :: area(void)'
的模糊继承
显而易见的原因是:有两种实现方式!
double area() { return a * b; } // in Rectangle
double area() { return a * h; } // in Rhombus
Square
继承了它们,因此编译器无法知道使用哪种方法。
你可以修复"它也会覆盖area()
中的Square
。
这种设计从一开始就有缺陷:Square
应该只包含一个成员,它的宽度/高度。但是你的成员包含四个成员,所有成员总是具有相同的价值!