C++ 为什么我的虚拟函数不赋值?

C++ 为什么我的虚拟函数不赋值?,c++,function,virtual,C++,Function,Virtual,我正在尝试使用虚函数来计算矩形和三角形的面积,如下所示:- #include<iostream> using namespace std; class Shape{ public: int width; int height; void get(){ cin>>width; cin>>height; } virtual void area(){ cout<<"Calc

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

#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作为两个形状的面积。我认为宽度和高度的值没有在三角形和矩形类中赋值。有人能告诉我哪里出错了吗?

问题是宽度和高度都被赋值给了shapeObj变量

但是您正在使用trObj和rectObj变量来计算面积

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,并在类中使用参数和返回值。

问题是宽度和高度被指定给shapeObj变量

但是您正在使用trObj和rectObj变量来计算面积

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,以及如何设计更好的提示:在主类中做I/O,使用C++中的参数和返回值。< /P>阅读一本好书,然后是C++编译器的文档,例如…也可以看到一些好的和好的。考虑使用。意识到这一点。启用编译器中的所有警告和调试信息,GCC使用G++WALL-WOTAL-GYES,这个错误是基本的,它应该由任何C++教程来回答。此外,学习如何使用调试器逐步完成代码将是一件非常有用的事情,可以帮助您自己解决这个问题。如果还没有,那么就把这个函数放在一边,把@john已经给出答案的main函数放在一边,派生类矩形和三角形中的面积函数应该是公共的。类默认为私有的。读一本好书,然后是C++编译器的文档,例如…也可以看到一些好的和好的。考虑使用。意识到这一点。启用编译器中的所有警告和调试信息,GCC使用G++WALL-WOTAL-GYES,这个错误是基本的,它应该由任何C++教程来回答。此外,学习如何使用调试器逐步完成代码将是一件非常有用的事情,可以帮助您自己解决这个问题。如果还没有,那么就把这个函数放在一边,把@john已经给出答案的main函数放在一边,派生类矩形和三角形中的面积函数应该是公共的。类的默认值是private。