如果我从Shape基类中创建一个指针,如何使其表现得像circle(派生)类一样?这是我的类(class)定义:

    //CShape.h class definition
    //Shape class definition
    #ifndef CSHAPE_H
    #define CSHAPE_H

    class CShape
    {
    protected:
        float area;
        virtual void calcArea();
    public:
        float getArea()
        {
            return area;
        }
    };


    class CCircle : public CShape
    {
    protected:
        int centerX;
        int centerY;
        float radius;
        void calcArea()
        {
            area = float(M_PI * (radius * radius));
        }
    public:
        CCircle(int pCenterX, int pCenterY, float pRadius)
        {
            centerX = pCenterX;
            centerY = pCenterY;
            radius = pRadius;
        }
        float getRadius()
        {
            return radius;
        }
    };

在我要调用这些对象的项目文件中,我有以下代码:
            CShape *basePtr = new CCircle(1, 2, 3.3);
            basePtr->getRadius();

在我看来,这应该可以工作,但是我被告知CShape没有成员“getRadius()”。

编辑
基于下面的响应,我试图像这样将dynamic_cast basePtr对象传递给CCircle:
CCircle *circle = new CCircle(1, 2, 3.3);
basePtr = dynamic_cast<CCircle *>(circle);

但是,这也失败了。我从来没有做过dynamic_cast,也不熟悉C++中的大多数语法,因此非常感谢您的帮助。

最佳答案

要获取getRadius函数,必须将其声明为CCircle类型:

        CCircle *basePtr = new CCircle(1, 2, 3.3);
        basePtr->getRadius();

否则,如果要将basePtr声明为CShape,请使用@janiz指出的与dynamic_cast进行动态绑定(bind)或直接使用c样式强制转换。
       CShape *basePtr = new CCircle(1, 2, 3.3);
       CCircle *child
       // choose one of the two ways, either this:
       child = (CCircle*)basePtr; // C-style cast
       // or this:
       child = dynamic_cast<CCircle*>(basePtr); // C++ version
       child->getRadius();

09-08 04:32