C++ 在多重继承中返回奇怪的int值
我正在修改多态性示例以测试多重继承。当我运行下面的代码时,我在控制台上得到一个奇怪的值“15794192”,结果是20。怎么了?我很感激你的意见 我试图解决由多重继承中的问题引起的错误,并提出了这段不会产生任何构建错误的代码。我正在讨论的问题可能不是源于多重继承,但我还不确定。网页中引用的原始示例作品很好,不用说 (环境)Ubuntu12.04,CMAKE2.8.7在EclipseIndigo上运行C++ 在多重继承中返回奇怪的int值,c++,multiple-inheritance,C++,Multiple Inheritance,我正在修改多态性示例以测试多重继承。当我运行下面的代码时,我在控制台上得到一个奇怪的值“15794192”,结果是20。怎么了?我很感激你的意见 我试图解决由多重继承中的问题引起的错误,并提出了这段不会产生任何构建错误的代码。我正在讨论的问题可能不是源于多重继承,但我还不确定。网页中引用的原始示例作品很好,不用说 (环境)Ubuntu12.04,CMAKE2.8.7在EclipseIndigo上运行 #include <iostream> using namespace std;
#include <iostream>
using namespace std;
class CPolygon //: public CShape
{
protected:
int width, height;
public:
void set_values(int a, int b)
{
width = a;
height = b;
}
virtual int area(void) =0;
void printarea(void)
{
cout << this->area() << endl;
}
};
class CustomPolygon : public CPolygon
{
public:
int customParam;
void printarea(void)
{
this->CPolygon::printarea();
}
};
class Rectangle : public CPolygon // This class should be concrete.
{
public:
int area(void)
{
return (width * height);
}
void printarea(void)
{
this->CPolygon::printarea();
}
};
class CustomSquare : public CustomPolygon, Rectangle // Concrete class
{
public:
int area()
{
this->Rectangle::area();
}
void printarea(void)
{
this->Rectangle::printarea();
}
void set_values(int a, int b)
{
this->Rectangle::set_values(a, b);
}
};
int main()
{
CustomSquare *cs = new CustomSquare();
cs->CustomSquare::set_values(4, 5);
cs->CustomSquare::printarea();
return 0;
}
您需要从
CustomSquare::area()
方法返回一些内容:
int area()
{
return this->Rectangle::area();
}
您还应该考虑使用虚拟继承,因为您有菱形继承的情况:
class CustomPolygon : virtual public CPolygon {};
class Rectangle : virtual public CPolygon {};
在
CustomSquare
中的函数区域
,您不会返回任何值
我不熟悉Eclipse,但我很确定有一种方法可以在这种情况下启用警告。在g++中,它将是
-Wreturn-type
开关,或者-Wall
谢谢,但是在这两个类声明中添加virtual会产生另一个错误的值(39272464)…并且,忘了提及,但是我希望矩形
是具体的类。@IsaacS抱歉,这不是错误的原因。这是丢失的返回问题。谢谢,现在它可以工作了。我的错。。。(在系统允许的情况下,我会接受这个答案)。我不确定这个例子是否会很有启发性。。。我对C++和继承很熟悉,并不是简单地遵循和理解预期的行为应该是什么。@戴维RoDr.Guez - Dr.BeDeBasas,我理解你在说什么,但不确定这个例子不具有启发性……你有什么想法吗?席,我的观点是,这个例子是复杂的OO基础。(虚拟函数分派)使用显式调用。主要问题是,您没有使用简单的类型层次结构,而是使用多重继承,并遇到了菱形问题(相同的基类型是通过层次结构中的不同路径创建的基,创建相同类型的多个子对象。这种类型的层次结构在现实场景中并不常见,发生时,通常通过虚拟继承进行处理(因此只有一个基(CPolygon
)对象。也就是说,从语义上讲,CustomSquare
不包含两个不同的CPolygon
,而是一个单独的CPolygon
。现在,如果层次结构不包含菱形或继承是虚拟的,那么CustomSquare
就不需要实现area
manua由于Rectangle
中的重写器已经是最终的重写器,您可能会得出结论,需要在CustomSquare
中提供区域
(根据编译器的要求),但这不是…继承的问题,而是您使用的奇怪设计的问题。
class CustomPolygon : virtual public CPolygon {};
class Rectangle : virtual public CPolygon {};