ZBLOG

分析下面代码,是否有错,它的输出是什么?试改进代码,使其能输出具体类型(派生类型)指定的输出,并给出你的依据(提示:无需修改已有类的定义,仅修改 main 中相关代码即可) #include using namespace std; class Base { public: virtual int print() { return -1; } }; class MyDerived : public Base { public: MyDerived(){} int pr...

该代码存在以下问题:

  1. 在向vector中添加对象时,会进行切片操作,导致存储在vector中的都是Base类的对象,而不是派生类的对象;
  2. 在输出时,使用了指针解引用符号(*)来访问迭代器指向的对象,这样会调用基类Base的print函数,并非派生类型指定的输出;
  3. 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获取指针所指对象的具体类型,并将其输出。修改后的代码能够正确输出派生类型指定的结果。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3721

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?