所以我有Shape.h,Rectangle.h,Circle.h和main.cpp。
Shape.h得到了:
class Shape{
public:
Shape() {};
~Shape() { cout << "Destroy Shape."; };
virtual double getArea() = 0;
virtual double getCircumference() = 0;
};
矩形和圆圈各自的代码。
现在在main.cpp我做
Shape* newRectangle= new Rectangle(4, 8);
Shape* newCircle= new Circle(10);
到目前为止一切都很精致和花花公子。这是我难倒的地方。我知道我要做什么,我只是不知道怎么做。
我正在尝试编写一个函数来检查Shape *对象是否属于Circle。
它就是这样的
if Shape* object belongs to Object-Type Circle, then
cout << "It's a Circle, bruh!";
else
cout << "Ain't a circle, yo!";
我开始用谷歌搜索后开始:
void check(Shape & object){
Circle& checkObject = dynamic_cast<Circle&>(object);
}
main中的函数将通过以下方式调用:
check(*newRectangle);
check(*newCircle);
但我还不知道如何继续:(。任何帮助和解释都表示赞赏。谢谢!
答案 0 :(得分:6)
尽量避免基于派生类型的逻辑。尽可能使用virtual
成员函数。
class Shape {
public:
virtual void print(std::ostream& out) const = 0;
...
};
并在派生的clases中实现该函数。
class Circle : public Shape {
public:
virtual void print(std::ostream& out) const
{
out << "Got a Circle.\n";
}
....
};
如果使用virtual
会员功能无法解决问题,则需要诉诸dynamic_cast
。
Shape* shapePtr = <some pointer>;
Circle* circlePtr = dynamic_cast<Circle*>(shapePtr);
if ( circlePtr ) {
// Access Circle functionality.
}
答案 1 :(得分:4)
您可以通过动态地将html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content
指针指向所需类型的指针并检查Shape
来执行此操作:
nullptr
这需要打开运行时类型信息,并且您的对象至少有一个虚拟函数(确实如此)。
注1:如果您必须执行此类操作,请查看您是否可以更改设计,以便不必执行此操作。例如,您可以应用多个调度模式,例如 Visitor ,以避免此检查:
if (dynamic_cast<Circle*>(object)) {
cout << "It's a Circle, bruh!";
}
现在你可以打印出你看到的那种形状:
struct ShapeVisitor {
virtual ~ShapeVisitor() {}
virtual void visitCircle(const Circle* circle);
virtual void visitRectangle(const Rectangle* rectangle);
};
class Shape{
public:
Shape() {};
virtual ~Shape() { cout << "Destroy Shape."; };
virtual double getArea() = 0;
virtual double getCircumference() = 0;
virtual void Accept(const ShapeVisitor& visitor) = 0;
};
struct Circle : public Shape {
virtual void Accept(const ShapeVisitor& visitor) {
visitor.visitCircle(this);
}
};
struct Rectangle : public Shape {
virtual void Accept(const ShapeVisitor& visitor) {
visitor.visitRectangle(this);
}
};
注2:您需要将struct PrintTypeVisitor : public ShapeVisitor {
virtual void visitCircle(const Circle* circle) {
cout << "It's a Circle, bruh!";
}
virtual void visitRectangle(const Rectangle* rectangle) {
cout << "It's a Rectangle, bruh!";
}
}
...
PrintTypeVisitor v;
Shape* object = ...
object.Accept(v); // This prints dynamic type of the object
的析构函数设为虚拟。