C ++访问抽象类指针向量的子类成员

时间:2015-05-16 20:44:23

标签: c++ class vector polymorphism abstract

此处有错误:

Rocket.cpp:31:16: error: no member named 'getThrust' in 'RocketPart'
    rocket[0]->getThrust();

当我想通过getThrust() Engine上的vector<RocketPart*> rocket rocket[i]->getThrust()访问Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load Dim p As Parameter = SQLDataSource.SelectParameters("Order_id") If IsNothing(p) Then SQLDataSource.SelectParameters.Add("Order_id", Server.HtmlEncode(Request.QueryString("Order_id")).ToString()) End If End Sub 时,我会从问题的顶部收到错误消息。 我究竟做错了什么?是否可以通过rocket [index] - &gt; getThrust()?

访问它

5 个答案:

答案 0 :(得分:2)

RocketPart内部没有函数getThrust(),这就是为什么调用函数的向量不起作用的原因。如果getThrust()是将在从它继承的类中使用的常用例程,则应将其作为虚函数添加到基类中,如下所示:

class RocketPart {
public:
    RocketPart();
    RocketPart(const RocketPart& orig);
    virtual ~RocketPart();

    virtual float getThrust();

    virtual void print() = 0;
protected:
    // some members
};

答案 1 :(得分:1)

您收到的错误是正确的:类getThrust中没有名为RocketPart的函数。你可以:

  • virtual float getThrust()课程中添加RocketPart。这可能不是一个好的解决方案,因为并非所有RocketPart都可以包含推力;但是,您可以简单地return 0,或者将其设为纯虚函数(这意味着您不再需要创建RocketPart对象
  • dynamic_cast您的RocketPart个对象加入Engine。这可以通过以下方式完成:

    for (size_t r = 0; r < rocket.size(); ++r) { if (const Engine* engine = dynamic_cast<Engine*>(rocket[r])) { // able to successfully convert this RocketPart into an Engine engine.getThrust(); } }

您将无法投放任何不属于RocketPart*

Engine

答案 2 :(得分:0)

您需要添加

virtual float getThrust() = 0;

RocketPart课程中。 此外,我完全没有理由使用虚拟继承(仅当你从多个类继承The Diamond Problem时才需要这样做),所以相反:

class Engine : virtual public RocketPart {

你应该只是:

class Engine : public RocketPart {

我还建议查看你的内存分配 - 如果你的示例源代码不只是一个例子(你正在泄漏Engine个对象,也许vector<shared_ptr<Engine>>会是一个更好的主意吗?)

答案 3 :(得分:0)

这是因为存储在容器中的类型是RocketPart。 您需要向下转换指向Engine的指针。 而不是

rocket[0]->getThrust();

你需要写:

Engine *pPart = (Engine *) rocket[i]; //you can use also static_cast<> or dynamic_cast<>
pPart->getThrust();

使用演员时要小心:如果rocket [i]不是引擎,程序可能会崩溃。

答案 4 :(得分:0)

方法getThrust()在Engine类中定义,而不是在RocketPart中定义。 您需要在基类RocketPart中移动该方法,以便通过向量访问它。 或者,您也可以使用动态强制转换来转换&#34; RocketPart到引擎。

Engine* engine = dynamic_cast<Engine>(rocket[index]);
if (engine) {
    engine->getThrust();
}

考虑使用dynamic_cast通常意味着糟糕的设计。