【问题标题】:Overriding parent class's function [duplicate]覆盖父类的功能[重复]
【发布时间】:2012-09-20 19:09:47
【问题描述】:
class classa {
public:
    virtual void foo();
};

class classb : public classa {
public:
     virtual void foo() override;
};


void classa::foo()
{
    std::cout << "foo from a" << std::endl;
}

void classb::foo()
{
    std::cout << "foo from b" << std::endl;
}

int main()
{
    std::vector<classa> stuff; 

    classa a;
    classb b;

    stuff.push_back(a);
    stuff.push_back(b);

    stuff[0].foo();
    stuff[1].foo();


    return 0;
}

我预计上面的代码会返回

foo from a 
foo from b

但它同时返回foo from a

我认为这是因为向量存储了classa,但我不确定。 如何让classb:foo()b 调用?

【问题讨论】:

  • "std::cout 东西;"好像错了,你确定那真的是你的代码吗?
  • @PeteFordham stackoverflow 出于某种原因更改了它。它旨在阅读(这也可能改变......): std::vector stuff;
  • 您不能在&lt;pre&gt; 中使用&lt;&gt;,因为它被解释为HTML。相反,使用四个空格缩进。
  • 哪个版本的 C++ 包含 override 关键字?

标签: c++ class function overriding


【解决方案1】:

这是因为对象切片,您需要保留一个指针向量(最好是智能指针)。

我假设stuff 被定义为std::vector&lt;classa&gt; stuff;。当你这样做

stuff.push_back(b);

推入向量中的对象是b 的一部分 - 特别是classa 部分。所有其他类型信息都将丢失。要使其按预期工作,您需要:

std::vector<classa*> stuff;

或类似的。你的代码现在的样子,你不能让它工作,因为stuff[1]不再是classb,而是classa

【讨论】:

  • 我必须使用stuff.push_back(&amp;a);。没错,对吧?
  • @andrew 要么,要么使用new 创建对象(然后使用delete )。
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2020-02-11
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多