我首先要为我的英语道歉并不是很好。我有一个问题,不知道该怎么做。我正在使用一个向量,其中保留指向对象抽象类旅行车的指针。该类的后代有自己定义的函数来提取有关货车的信息。我不知道我是否正确解决了,但是当我经历循环时,指定索引处的元素消失了,而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();
}
}
答案 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()是纯虚拟的,我无法调用。 -