C ++ / Polymorphism / Virtual Functions /为什么我的子类的函数没有被调用?

时间:2014-11-18 18:20:11

标签: c++ inheritance c++11 polymorphism

我环顾四周,大多数问题涉及为什么要使用虚拟,多态性是什么等等。我在我的程序中遇到问题,我想知道为什么没有调用子函数以及如何在这种情况下实际 CALL 子函数。

我可以效仿我的问题:

#include <string>
#include <iostream>
#include <vector>

class BaseA {
  public:
  BaseA(const std::string &n)
    : name(n)
  {
  }

  virtual void print() const
  {
    std::string str("");
    str += name;
    std::cout << str << std::endl;
  }

  protected:
  std::string name;
};

class BaseB : public BaseA {
  public:
  BaseB(const std::string &n, const std::string &v)
    : BaseA(n), value(v)
  {
  }

  void print() const
  {
    std::string str("");
    str += name;
    str += ' ';
    str += value;
    std::cout << str << std::endl;
  }

  private:
  std::string value;
};

int main() {
  std::vector<BaseA> vec;
  vec.push_back(BaseA("cat"));
  vec.push_back(BaseB("cat", "kitten"));

  for(BaseA &obj : vec)
    obj.print();

  return 0;
}


为什么输出:猫猫?

如何将输出更改为&#34; cat cat kitten&#34;使用BaseB :: print()?

1 个答案:

答案 0 :(得分:4)

正如rightføld所指出的,你是切片问题的受害者。但是,由于您的问题标记为C ++ 11,因此您可以利用std::unique_ptr

std::vector<std::unique_ptr<BaseA>> vec;
vec.push_back(std::make_unique<BaseA>("cat"));
vec.push_back(std::make_unique<BaseB>("cat", "kitten"));

for(std::unique_ptr<BaseA>& obj : vec)
    obj->print();

不幸的是,在C ++ 14之前未添加std::make_unique,您可以选择使用emplace_back

std::vector<std::unique_ptr<BaseA>> vec;
vec.emplace_back(new BaseA("cat"));
vec.emplace_back(new BaseB("cat", "kitten"));

for(std::unique_ptr<BaseA>& obj : vec)
    obj->print();