问题描述
据说,通过多态,我们可以使用它的基类对象访问派生类成员字段,如下所示:
It's said that with polymorphism, we can access a derived class member field with it's base class object like this:
#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
,它包含从工具类。如果用word描述,它将是This Person
, Programmer
,有一些 tools
。他的第一个工具
是一个计算机
。如果你想知道它是什么的价格
,使用 getInfo()
。
The result wasn't what I expected. What I need is every derived class from Person
have a vector tools
that contains object that inherit from Tool
class. If it described with word, it will be, "This Person
, a Programmer
, has some tools
. His first Tool
is a Computer
. If you want to know what's it's price
, use getInfo()
."
- 为什么vector取基类而不是派生类?
-
cmp
对象是否有任何数据丢失当我把它放在工具
vector? - 这是否发生是因为
tools
矢量成员拿工具
因为它的类型?
- Why vector take the base class instead of the derived class?
- Is there any data loss from
cmp
object when i put it insidetools
vector? - Is this happen because
tools
vector member takeTool
as it's type?
推荐答案
C ++中的运行时多态性,通过虚函数实现,适用于。您确实会丢失派生对象中包含的信息。当您将计算机
插入向量<工具>
时,就是这种情况。
Assigning a derived class object to a base class is called object slicing. You do lose information contained in the derived object. This is the case when you are inserting a Computer
into a vector<Tool>
.
这篇关于如何使用多态从基类访问派生类向量成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!