在C ++中使用多态性访问类的孙子

尼古拉斯(Nicholaus Cjj)

我被要求以多态实现此图表,其输出是计算几何形状:

标准如下:

  • print()和getArea()函数放置在基础类Shape中。也有人问这是一个纯虚函数,但我开始怀疑它(..?)
  • getPerimeter()函数放在2d类中,而getVolume()在3d类中
  • 尺寸形状的每个子代都有getArea()和getPerimeter()或getVolume(),取决于尺寸,其功能是计算

这是我所做的摘要。为了简化,我将以2d类为例:

//base initiation
    class Shape{
public: 
    virtual void print(){};
    virtual void getArea(double n){};
};

//2d class which is derived from base class
class TwoDimensionalShape : public Shape{
public:
    virtual void getPerimeter(double n){};
};

//The actual shape
class Circle : public TwoDimensionalShape{
protected: 
    double perimeter, area;
public:
    void getArea(double radius){
         this->area=(3.1415*radius*radius);
    }
    void getPerimeter(double radius){
        this->perimeter=(3.1415*2*radius);
    }
    void print(){
        cout << "Circle's perimeter: " << this->perimeter << endl;
        cout << "Circle's area: " << this->area << endl;
    }
    Circle(){};
    ~Circle(){};
};

对于用法本身是:

//setting the object as global
Shape *object;
//the class
void circle(){
    Circle circle;
    object=&circle;
    double radius;
    system("cls");
    do{
        cout << "Enter radius value: ";
        cin >> radius; flush();
    } while (radius<=0);
    object->getPerimeter(radius); object->getArea(radius);
    object->print(); cin.get();
}

而且我认为我做到了,但是没有!错误列表显示:

Error   4   error C2039: 'getPerimeter' : is not a member of 'Shape'
Error   5   IntelliSense: class "Shape" has no member "getPerimeter"    

我当时正在考虑使用演员表,但我显然没有使用它的经验。

长话短说,仅使用Shape *对象(该对象也用于球体,立方体,四面体等),如何才能访问任何派生类?

ps这不是TwoDimensionalShape类应包含什么的重复项因为它要求完全不同的事情

编辑1:是的,签名很烂,因此以后我将在我的桌面以及此代码中编辑我的代码,请继续。谢谢!

AresCaelum

所以,让我把你说的话分开:

print()和getArea()函数放置在基础类Shape中。也有人问这是一个纯虚函数,但我开始怀疑它(..?)

从您的代码中您不知道什么是纯虚拟的,任何具有纯虚拟的类都将成为所谓的抽象基类,有关抽象基类的基调是您无法创建它的实例,并且每个继承自该类的类它必须覆盖这些函数,您可以通过执行以下操作来构建纯虚拟函数:

class Shape{
public: 
    virtual void print() = 0;
    virtual double getArea() = 0;
};

getPerimeter()函数放在2d类中,而getArea()在3d类中

getArea()并且getPerimeter()您确定它不应该是getVolume()and getPerimeter(),因为根据您的第三个要求,在子类中应该and getArea()在3d类中已经存在,因为3d类必须覆盖它,而2d类也是如此。

长话短说,仅使用Shape *对象(该对象也用于球体,立方体,四面体等),如何才能访问任何派生类?

简而言之,您根本不会Shape*知道基类中定义的getPerimeter()是什么或什么getVolume()您确实可以选择使用临时的TwoDimensionalShape*对象并对其进行动态转换,然后使用该临时的指针来获取周长。

喜欢:

TwoDimensionalShape* ptr_shape = dynamic_cast<TwoDimensionShape*>(object);
if(ptr_shape)
{
    ptr_shape->getPerimeter(/*arguments here if you have them...*/)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章