如果我从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();