gpt4 book ai didi

C++ 虚拟继承 - 虚函数 ""的覆盖不明确

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:17 27 4
gpt4 key购买 nike

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

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)'

我做错了什么?

最佳答案

错误信息是:

'Square': ambiguous inheritance of 'double Polygon::area(void)'

原因应该很明显:有两种实现方式!

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

Square 继承了它们,因此编译器不可能知道使用哪个。

您也可以通过覆盖 Square 中的 area() 来“修复”它。

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

关于C++ 虚拟继承 - 虚函数 ""的覆盖不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com