【问题标题】:Why is my virtual function not assigning values?为什么我的虚函数没有赋值?
【发布时间】:2020-06-08 05:45:15
【问题描述】:

我正在尝试使用虚函数来计算矩形和三角形的面积,如下所示:-

#include<iostream>
using namespace std;

class Shape{
   public:
   int width;
   int height;
   void get(){
       cin>>width;
       cin>>height;
   }

   virtual void area(){
       cout<<"Calculates area";
   }
};

class Triangle:public Shape{

  void area(){
      int a = height*width/2;
      cout<<a<<endl;
  }
};

class Rectangle:public Shape{

  void area(){
      int a = height*width;
      cout<<a<<endl;
  }
};





int main(){
    Shape shapeObj;
    shapeObj.get();

    Shape *ptr;
    Triangle trObj;
    Rectangle rectObj;

    ptr=&trObj;
    ptr->area();

    ptr=&rectObj;
    ptr->area();
}

但我的程序返回 0 作为两个形状的面积。我认为三角形和矩形类中没有分配宽度和高度的值。有人能告诉我哪里出错了吗?

【问题讨论】:

  • 阅读一本好的 C++ programming 书籍,然后阅读 C++ 编译器的文档(例如 GCCClang...)。另请参阅一些好的 C++ referenceHow to debug small programs。考虑使用GDB。请注意rule of five。在编译器中启用所有警告和调试信息,使用 GCC 使用 g++ -Wall -Wextra -g
  • 是的,这个错误是根本性的,任何 C++ 教程都应该回答它。此外,学习如何使用调试器逐步执行代码将是一件有用的事情,可以帮助您自己解决这个问题。如果您还没有,请使用tour 并阅读How to Ask
  • main 函数放在一边,您已经得到@john 的答案,派生类RectangleTriangle 中的area() 函数应该是公开的。 class 的默认值为 private

标签: c++ function virtual


【解决方案1】:

问题是宽度和高度分配给shapeObj变量

Shape shapeObj;
shapeObj.get();

但您正在使用trObjrectObj 变量来计算面积。

Triangle trObj;
Rectangle rectObj;
ptr=&trObj;
ptr->area();
ptr=&rectObj;
ptr->area();

试试这个

int main()
{
    Triangle trObj;
    trObj.get();
    Shape* ptr=&trObj;
    ptr->area();

    Rectangle rectObj;
    rectObj.get();
    ptr=&rectObj;
    ptr->area();
}

当然,因为您有两个变量并且调用了两次get,所以这段代码将要求两次宽度和高度。如果这不是您想要的,那么请仔细考虑如何在该程序中执行 I/O,以及如何更好地设计它(提示:在 main 中执行 I/O 并在您的类中使用参数和返回值) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2017-12-10
    • 2011-11-14
    • 1970-01-01
    • 2019-10-14
    • 2018-11-12
    • 2018-01-27
    相关资源
    最近更新 更多