Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多重继承中返回奇怪的int值_C++_Multiple Inheritance - Fatal编程技术网

C++ 在多重继承中返回奇怪的int值

C++ 在多重继承中返回奇怪的int值,c++,multiple-inheritance,C++,Multiple Inheritance,我正在修改多态性示例以测试多重继承。当我运行下面的代码时,我在控制台上得到一个奇怪的值“15794192”,结果是20。怎么了?我很感激你的意见 我试图解决由多重继承中的问题引起的错误,并提出了这段不会产生任何构建错误的代码。我正在讨论的问题可能不是源于多重继承,但我还不确定。网页中引用的原始示例作品很好,不用说 (环境)Ubuntu12.04,CMAKE2.8.7在EclipseIndigo上运行 #include <iostream> using namespace std;

我正在修改多态性示例以测试多重继承。当我运行下面的代码时,我在控制台上得到一个奇怪的值“15794192”,结果是20。怎么了?我很感激你的意见

我试图解决由多重继承中的问题引起的错误,并提出了这段不会产生任何构建错误的代码。我正在讨论的问题可能不是源于多重继承,但我还不确定。网页中引用的原始示例作品很好,不用说

(环境)Ubuntu12.04,CMAKE2.8.7在EclipseIndigo上运行

#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 {};