据说,通过多态,我们可以使用它的基类对象访问派生类成员字段,如下所示:
#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
类继承的对象。如果用单词进行描述,则会显示“此Person
,Programmer
,tools
。{他的第一个Tool
是Computer
。如果你想知道它是price
是什么,请使用getInfo()
。“
cmp
对象放入tools
向量内时,是否有任何数据丢失?tools
向量成员会将Tool
视为类型?答案 0 :(得分:4)
通过虚函数实现的C ++中的运行时多态性适用于covariant类型。唯一的协变类型是指针和引用。由于你有一个vector<Tool>
,你会失去多态性。要保留它,请存储vector<Tool*>
。更好的是,存储vector<unique_ptr<Tool>>
。
将派生类对象分配给基类称为object slicing。您确实丢失了派生对象中包含的信息。将Computer
插入vector<Tool>
时会出现这种情况。