繁体   English   中英

如何使用多态从基类访问派生类向量成员?

[英]How to use polymorphism to access derived class vector member from base class?

据说,通过多态性,我们可以使用其基类对象访问派生类成员字段,如下所示:

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

using namespace std;

class Tool{
    public:
        Tool(){}
        Tool(string name){
            this->name = name;
        }
        virtual string getInfo(){
            return name;
        }
    //protected:
        string name;
};

class Computer: public Tool{
    public:
        Computer(string name, int price){
            this->name = name;
            this->price = price;
        }
        virtual string getInfo(){
            return name + ": " + to_string(static_cast<long long>(price));
        }
    //protected:
        int price;
};

class Person{
    public:
        Person(){}
        Person(string name){
            this->name = name;
        }
        virtual string getInfo(){
            return name;
        }
        virtual void addTools(Computer cmp){
            tools.push_back(cmp);
        }
    //protected:
        vector<Tool> tools;
        string name;
};

class Programmer: public Person{
    public:
        Programmer(string name, string job){
            this->name = name;
            this->job = job;
        }
        string getInfo(){
            return name + ": " + job;
        }
    //protected:
        string job;
};

int main(){
    Person prs("Person");
    Programmer prg("Daphloon", "programmer");

    Person* prs1 = &prs;
    Person* prs2 = &prg;

    cout << prs1->getInfo() << endl;    // result: Person
    cout << prs2->getInfo() << endl;    // result: Daphoon: programmer

    Tool tl("Hammer");
    Computer cmp("PC", 100);

    Tool* tl1 = &tl;
    Tool* tl2 = &cmp;


    cout << tl1->getInfo() << endl;     // result: Hammer
    cout << tl2->getInfo() << endl;     // result: PC: 100

    prs2->addTools(cmp);

    cout << prs2->tools[0].getInfo() << endl;   // result: PC
                                                // I expect the result will be: PC: 100 

    return 0;
}

结果不是我预期的。 我需要的是Person每个派生类都有一个矢量tools ,其中包含从Tool类继承的对象。 如果用词描述,它将是:“这个PersonProgrammer ,有一些tools 。他的第一个ToolComputer 。如果您想知道它的price ,请使用getInfo() 。”

  1. 为什么vector采用基类而不是派生类?
  2. 当我将cmp对象放入tools向量中时,是否有任何数据丢失?
  3. 是否因为tools向量成员将Tool作为其类型而发生了?

通过虚拟函数实现的C ++运行时多态性适用于协变类型。 唯一的协变类型是指针和引用。 由于具有vector<Tool> ,因此失去了多态性。 要保留它,请存储vector<Tool*> 更好的是,存储vector<unique_ptr<Tool>>

将派生类对象分配给基类称为对象切片 您会丢失包含在派生对象中的信息。 Computer插入vector<Tool>时就是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM