从抽象类传递函数

时间:2014-03-09 02:32:17

标签: c++ polymorphism abstract-class derived-class

我正在尝试将print函数从抽象类“shape”传递给派生类“circle”和“square”。它应打印出“名称:”,后跟形状名称。出于某种原因,它无法正常工作。我是否需要为每个派生类重新声明并重新定义print?或者我没有正确传递它,或者名称是否未正确存储在派生函数中?

为了澄清:我只是想让它在循环数组时正确打印出来。任何建议将不胜感激。

谢谢!

这些应该是相关的代码:

print()在形状头文件中声明。

In shape.cpp

void shape::setName( const string &shapeName )
{
    name = shapeName;
}

//return name
string shape::getName() const
{
    return name;
}


void shape::print() const
{
    cout<<"Name: "<<getName()<<endl;
}
square://中的

构造函数(与其他派生类相同)

square::square(const string &name, const int &sideLength)
    : shape ( name )
{
    setSideLength(sideLength);
}

主要:

//create derived class objects with side lengths:
    square square1(
        "square", 3);

//an object array named shapesArray is created with an instance of square and circle

for(int x = 0; x < 3; x++)
    {
        shapesArray[x]->print();
        cout<<"The distance around this shape is: "<<shapesArray[x]->getDistanceAround()<<endl;

3 个答案:

答案 0 :(得分:1)

如果要使用指针,最好使用动态绑定的C ++功能和virtual函数:

virtual string shape::getName() const //in shape
{
    return "shape";
}
virtual string square::getname() const //in square
{
    return "square";
}

shape *s();
s = &shapeobj;
s.getName(); //shape
s = &squareobj;
s.getName(); //square

答案 1 :(得分:1)

从你的标题中,我假设你在一个标题shape.h中有一个抽象的基类,你没有向我们展示,以及声明 print()。

在每个派生类中都算作声明。现在,您需要在每个派生类中定义 print(),以提供实现。它看起来像:

void square::print() {
  // implementation
}
void triangle::print() {
  // implementation
}

无论您在cpp文件中提供定义,还需要在头文件中提供声明。标题是你的类的声明,cpp只是实现。

答案 2 :(得分:1)

我认为你要做的是如下所示。你需要通过独占调用setname方法或者在它们的构造函数本身中为派生类正确设置“name”。

  class Shape
  {
   public:
   string name; 
   void setName( const string &shapeName )
   {
     name = shapeName;
    }
   string getName() const
  {
   return name;
   }
   void print() const
  {
   cout<<"Name: "<<getName()<<endl;
   }
  };

  class Circle:public Shape
  {
   public:
    Circle()
    {
      name = "Circle";
    } 
   };

   class Square:public Shape
   { 
    public:
    Square()
    {
      name = "Square";
    }
    };
  int main()
  {
   Shape* shapesArray[5];
   shapesArray[0]->setName("check");
   Circle lCircle;      
   shapesArray[1]=&lCircle;
   Square lSquare;
shapesArray[2]=&lSquare;  

   for(int x = 0; x < 3; x++)
   {
     shapesArray[x]->print();

  }

}