C++ 如何在使用new运算符创建派生对象时解析非基类成员

C++ 如何在使用new运算符创建派生对象时解析非基类成员,c++,oop,C++,Oop,如何在使用new运算符创建派生对象时解析非基类成员 当我执行下面的程序时,只有当我使用新操作符“shape*s=new Rectangle”创建对象时,才会出现下面的错误;。但我在创建对象“矩形s”时没有遇到任何问题 实际上,我不想在我的三角形类中使用hello方法。需要通过使用新操作符“shape*s=new rectangle”创建对象来访问/使用矩形类中的hello方法 请让我们知道如何使用新操作员解决此问题 错误: 1>c:\shape\shape\shape.cpp(60) :

如何在使用new运算符创建派生对象时解析非基类成员

当我执行下面的程序时,只有当我使用新操作符“shape*s=new Rectangle”创建对象时,才会出现下面的错误;。但我在创建对象“矩形s”时没有遇到任何问题

实际上,我不想在我的三角形类中使用hello方法。需要通过使用新操作符“shape*s=new rectangle”创建对象来访问/使用矩形类中的hello方法

请让我们知道如何使用新操作员解决此问题

错误:

1>c:\shape\shape\shape.cpp(60) : error C2039: 'hello' : is not a member of 'Shape'
1>c:\shape\shape\shape.cpp(10) : see declaration of 'Shape'
代码段:

// Shape.cpp : Defines the entry point for the console application.
//

#include <iostream>

using namespace std;

// Base class
class Shape 
{
public:
   // pure virtual function providing interface framework.
   virtual int getArea() = 0;

   void setWidth(int w)
   {
      width = w;
   }
   void setHeight(int h)
   {
      height = h;
   }
protected:
   int width;
   int height;
};

// Derived classes
class Rectangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height); 
   }
   void hello()
   {
        std:cout<<std::endl<<"hello"<<std::endl;
   }
};
class Triangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height)/2; 
   }
};

int main(void)
{

   Shape *s= new Rectangle;
  // Triangle  Tri;

   s->setWidth(5);
   s->setHeight(7);
   // Print the area of the object.
   cout << "Total Rectangle area: " << s->getArea() << endl;
   s->hello();
/*
   Tri.setWidth(5);
   Tri.setHeight(7);
   // Print the area of the object.
   cout << "Total Triangle area: " << Tri.getArea() << endl; 
*/
   return 0;
}
//Shape.cpp:定义控制台应用程序的入口点。
//
#包括
使用名称空间std;
//基类
阶级形态
{
公众:
//提供接口框架的纯虚拟函数。
虚拟int getArea()=0;
无效设置宽度(int w)
{
宽度=w;
}
空隙设置高度(内部高度)
{
高度=h;
}
受保护的:
整数宽度;
内部高度;
};
//派生类
类矩形:公共形状
{
公众:
int getArea()
{ 
返回(宽度*高度);
}
void hello()
{

std:cout您有一个指向
Shape
的指针,但是(这是您的编译器告诉您的)
Shape
没有成员
hello()

因此,有两种方法可以访问它:
首先将其强制转换为
Rectangle*
(对于非矩形可能会失败),或者创建一个函数
virtualvoid hello()
Shape
中,对于从Shape继承的所有类,这将在编译时得到解决。

您的问题与您的问题不同。^^这是正确的。您将继承问题误认为是您告诉指针它需要是指向Shape的指针,而不是矩形的指针。Shape不知道hello().Virtual void hello()在形状中,或者只制作一个矩形*而不是一个形状*,如果可行的话。哦,只是在OP的帖子上评论了一些类似的东西,但这是毫无价值的。或者使用dynamic_cast(s)如果你确定它是一个矩形,当我在矩形*中键入casting时,它对我有效。谢谢你的回答。但是Virtual void hello()在形状上,它不能解决这个问题。请让我知道如何使用“virtual void hello()”来解决问题。请看一看-公认的答案提供了如何使用虚拟函数以及它们为什么有用的详细信息。