该代码存在以下问题:
- 在向vector中添加对象时,会进行切片操作,导致存储在vector中的都是Base类的对象,而不是派生类的对象;
- 在输出时,使用了指针解引用符号(*)来访问迭代器指向的对象,这样会调用基类Base的print函数,并非派生类型指定的输出;
- main函数应该返回int类型而不是void类型。
改进后的代码如下:
#include <iostream>
#include <vector>
using namespace std;
class Base {
public:
virtual int print() { return -1; }
};
class MyDerived : public Base {
public:
MyDerived(){}
int print() override { return 11; } // 派生类型指定的输出
};
class YourDerived : public Base {
public:
YourDerived(){}
int print() override { return 99; } // 派生类型指定的输出
};
int main() {
MyDerived d1,d2; YourDerived d3, d4;
vector<Base*> svec; // 存储Base类指针
svec.push_back(&d1); svec.push_back(&d2);
svec.push_back(&d3); svec.push_back(&d4);
vector<Base*>::iterator sitr = svec.begin();
while( sitr != svec.end() ) {
cout << typeid(**sitr).name() << ": " << (*sitr)->print() << endl;
sitr++;
}
return 0;
}
修改后的代码将vector中存储对象改为存储Base类指针,并且使用了虚函数关键字和override关键字。在输出时,使用typeid获取指针所指对象的具体类型,并将其输出。修改后的代码能够正确输出派生类型指定的结果。