向量方法抽象类的后代

时间:2014-12-29 20:12:54

标签: c++

我首先要为我的英语道歉并不是很好。我有一个问题,不知道该怎么做。我正在使用一个向量,其中保留指向对象抽象类旅行车的指针。该类的后代有自己定义的函数来提取有关货车的信息。我不知道我是否正确解决了,但是当我经历循环时,指定索引处的元素消失了,而Vector Here只剩下_vfptr所以如果我想再次骑行循环,我就不会列出任何东西。我会很高兴你有什么建议你如何处理你,或者我,你甚至可以要求一些东西。函数我的父类中的Vypis()是纯虚拟的,我无法调用。

for (int i = 0; i < _vagony.size(); i++){
        cout << " - ";

        if (typeid(*_vagony.at(i)) == typeid(DinningCar))
            {
                dinCar= dynamic_cast<DinningCar*>(_vagony.at(i));
                dinCar->Vypis();
            }
        if (typeid(*_vagony.at(i)) == typeid(BedWagon))
            {
                bedWag= dynamic_cast<BedWagon*>(_vagony.at(i));
                bedWag->Vypis();
            }
            if (typeid(*_vagony.at(i)) == typeid(PassangerWagon))
            {
                passWag= dynamic_cast<PassangerWagon*>(_vagony.at(i));
                passWag->Vypis();
            }
    }

2 个答案:

答案 0 :(得分:0)

您可以通过虚拟功能调度正确的方法。请看以下示例:

#include <memory>
#include <vector>
#include <iostream>

class Wagon {
 public:
  virtual ~Wagon() = default;
  virtual void Vypis() const {
    std::cout << "Wagon" << std::endl;
  }
};

class DinningCar
    : public Wagon {
  void Vypis() const {
    std::cout << "DinningCar" << std::endl;
  }
};

class BedWagon
    : public Wagon {
  void Vypis() const {
    std::cout << "BedWagon" << std::endl;
  }
};

class PassengerWagon
    : public Wagon {
  void Vypis() const {
    // suppose you also want this particular wagon to call the
    // "generic" method (that is, the one implemented by the parent
    // class)
    Wagon::Vypis();
    std::cout << "PassengerWagon" << std::endl;
  }
};

int main() {

  std::vector<std::unique_ptr<Wagon>> wagons;

  wagons.emplace_back(new DinningCar);
  wagons.emplace_back(new BedWagon);
  wagons.emplace_back(new PassengerWagon);
  wagons.emplace_back(new DinningCar);
  wagons.emplace_back(new Wagon);

  for(const auto& wagon : wagons) {
    wagon->Vypis();
  }

  return 0;
}

编译:

g++ Wagons.cpp -std=c++11 -Wall -Wextra

并运行:

$ ./a.out
DinningCar
BedWagon
Wagon
PassengerWagon
DinningCar
Wagon

注意如何选择是调用父实现(如PassengerWagon)还是仅调用子实现; C ++将在内部处理虚函数调度。

答案 1 :(得分:0)

对不起,我忘了在课堂上写这篇文章,我有纯粹的虚功能 谢谢你的回答,起初我做的很简单:_vagony.at(i) - &gt; Vypis();但它不起作用,因为我的父类中的函数Vypis()是纯虚拟的,我无法调用。 -