【问题标题】:Determining which derived class the pointer to the abstract class is set to确定将抽象类的指针设置为哪个派生类
【发布时间】:2012-07-05 19:21:14
【问题描述】:

我不确定我是否像我喜欢的那样表达了我的问题,但我会举一个例子来澄清问题。

代码如下:

class Shape;
class Circle;
class Triangle;

class Shape
{
    Shape(void);
    ~Shape(void);

    virtual void DrawShape(void) = 0;
}

class Circle : public Shape
{
    /* .... constructor/destructor defined normally .... */
    bool TestIntersection(Triangle* _triangle);
    bool TestIntersection(Circle* _circle);
    void DrawShape(void);
}

/* main.cpp */

...
Shape* shape;
Shape* circle = new Circle;

if(a == 0)
{
    shape = new Circle;
}
else
{
    shape = new Triangle;
}

circle->TestIntersection(shape);

我得到的错误是没有可接受的从 Shape* 到 Circle* 或 Triangle* 的转换。

为什么会这样?还是我需要一种方法来确定已将哪个派生类设置为抽象类指针?

【问题讨论】:

  • Circle 不是从 Shape 派生的。 circle. 也不起作用,因为 circle 是一个指针。请您发布一些真实的代码,以免造成混乱?
  • (因为试图知道派生类型是什么,是向下转换的第一步)

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


【解决方案1】:

你需要的基本上是这样的:

我注意到您没有从Shape 派生您的应该派生类。也解决这个问题。也就是说,TriangleCircle 应该派生自 Shape。之后,阅读访问者模式、它的各种实现和用法。这将帮助您解决问题。

【讨论】:

  • 谢谢,我想这可能正是我正在寻找的。非常感谢。
  • 嗯...我已经阅读了访问者模式,它为我的代码应该如何工作提供了很多灵感,但如果有人能给我一个明确的例子来说明如何为我上面的代码实现它。我真的很感激。 (我已经更改了上面的代码:Circle 和 Triangle 是 Shape 的派生类型,我只是忘了输入那个位。)
【解决方案2】:

您的Circle 类似乎没有从Shape 继承:

试试这个:

class Circle : Shape
{

}

【讨论】:

  • 这是为什么呢?如果 Circle 继承自 Shape,Shape * 可以明确地持有一个 Circle *。
  • 真正的问题是对TestIntersection的调用;没有需要 Shape* 的重载。
  • 但他的问题在于 ctor 和 assignment,不确定他是否想要拥有该功能。但我觉得这不是手头的编译问题。
  • 大概 OP 将从这里的 public 继承中受益。
  • 是的,OP 需要一次修复一件事 :)
【解决方案3】:

发生这种情况是因为您实际上没有从 Shape 派生。

class Circle: public Shape {
...
};

【讨论】:

  • 标题的问题?不,但它确实回答了问题描述末尾的问题。至于检测是哪个派生类:有很多方法可以解决。一种是使用typeid()和type_info,另一种是在Shape类中定义一个抽象方法,其他人必须用它来标识自己(意味着维护开销,但对象代码比第一种方法少)
  • 您能否更具体地说明如何定义这个抽象方法?
  • virtual Kind kind() const = 0;
  • enum Kind { Circle, Triangle, Line, Point, BlackHole };
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多