C++ C++;Iget如何调用正确的方法?
然后,在我的主文件中:C++ C++;Iget如何调用正确的方法?,c++,oop,C++,Oop,然后,在我的主文件中: class MobileContract { private: string _planID; string _contractID; PhoneModel _phoneModel; public: MobileContract(const string planID,const string contractID,const PhoneModel &phoneModel); virtual double calcPlanP
class MobileContract
{
private:
string _planID;
string _contractID;
PhoneModel _phoneModel;
public:
MobileContract(const string planID,const string contractID,const PhoneModel &phoneModel);
virtual double calcPlanPhonePrice();
virtual void display();
};
class RoadshowContract : public MobileContract
{
private:
double rsPhoneDiscount;
public:
RoadshowContract(string planID, string contractID, PhoneModel& phoneModel, double rsPhoneDiscount);
double calcPlanPhonePrice();
void display();
};
std::vect={
MobileContract(“planA”、“0”、PhoneModel(“800”、“蓝色”、900.50”),
MobileContract(“planB”、“1”、PhoneModel(“750c”、“米色”、500”),
路演合同(“planC”,“2”,电话型号(“2110”,“红色”,1000),50),
路演合同(“planA”,“3”,电话型号(“300”,“绿色”,1000),50)
};
对于(int i=0;i
std::vector<MobileContract> vect = {
MobileContract("planA","0", PhoneModel("800","Blue",900.50)),
MobileContract("planB","1", PhoneModel("750c","Beige",500)),
RoadshowContract("planC","2", PhoneModel("2110","Red",1000), 50 ),
RoadshowContract("planA","3", PhoneModel("300","Green",1000), 50)
};
for (int i = 0; i < vect.size(); i++) {
vect[i].calcPlanPhonePrice();
vect[i].display();
cout << "=============================" << endl;
}
但是,您的向量类型为MobileContact,因此,调用的方法将始终是这样。要更改此类型,您必须使用指针和多态性。然后,您的主cpp将如下所示:
class RoadshowContract : public MobileContract
{
private:
double rsPhoneDiscount;
public:
RoadshowContract(string planID, string contractID, PhoneModel& phoneModel, double rsPhoneDiscount);
double calcPlanPhonePrice() override;
void display() override;
};
std::vect={
新MobileContract(“planA”、“0”),
新MobileContract(“planB”、“1”),
新路演合同(“planC”、“2”、50),
新路演合同(“planA”、“3”、50)
};
对于(int i=0;icalcPlanPhonePrice();
vect[i]->display();
coutvect
存储MobileContract
,而不是RoadshowContract
。就这么简单。因为MobileContract
是RoadshowContract
的公共基类,所以尝试将它们存储在vect
中,将RoadshowContract
切分
您必须使用指针,但智能指针是一种选择。请注意:您不能以这种方式存储多态对象,您必须使用指针
如果要将MobileContract
和RoadshowContract
存储在同一个向量中,则必须使用std::vector
或更好的std::vector
使用智能指针的示例(需要C++11或更新版本)
std::vect={
std::使_共享(“平面”、“0”、电话模型(“800”、“蓝色”、900.50”),
std::使_共享(“planB”,“1”,电话模型(“750c”,“米色”,500)),
std::static_pointer_cast(std::make_shared(“planC”、“2”、PhoneModel(“2110”、“Red”、1000)、50”),
std::静态指针转换(std::使指针共享(“平面”、“3”、电话模型(“300”、“绿色”、1000)、50))
};
用于(自动和x:vect){
x->calcPlanPhonePrice();
x->display();
cout如果你肯定绝对不想使用指针(为什么?),你可以使用两个不同的向量来完成它:
std::vector<std::shared_ptr<MobileContract>> vect = {
std::make_shared<MobileContract>("planA", "0", PhoneModel("800","Blue",900.50)),
std::make_shared<MobileContract>("planB","1", PhoneModel("750c","Beige",500)),
std::static_pointer_cast<MobileContract>(std::make_shared<RoadshowContract>("planC","2", PhoneModel("2110","Red",1000), 50 )),
std::static_pointer_cast<MobileContract>(std::make_shared<RoadshowContract>("planA","3", PhoneModel("300","Green",1000), 50))
};
for (auto & x : vect) {
x->calcPlanPhonePrice();
x->display();
cout << "=============================" << endl;
}
std::vector mobvect={
MobileContract(“planA”、“0”、PhoneModel(“800”、“蓝色”、900.50”),
MobileContract(“planB”、“1”、PhoneModel(“750c”、“米色”、500))
}
标准::矢量道路显示矢量={
路演合同(“planC”,“2”,电话型号(“2110”,“红色”,1000),50),
路演合同(“planA”,“3”,电话型号(“300”,“绿色”,1000),50)
};
然后迭代每一个-在现实生活中,您可能希望将其作为单个方法,并在每个向量上调用它,但出于这个问题的目的:
std::vector<MobileContract> mobvect = {
MobileContract("planA","0", PhoneModel("800","Blue",900.50)),
MobileContract("planB","1", PhoneModel("750c","Beige",500))
}
std::vector<RoadshowContract> roadshowvect = {
RoadshowContract("planC","2", PhoneModel("2110","Red",1000), 50 ),
RoadshowContract("planA","3", PhoneModel("300","Green",1000), 50)
};
for(int i=0;i 请注意这是一个功能。覆盖
主要是一个注释。编译器会检查它是否正确,但它只会告诉读者被覆盖的函数存在于基类中。我们已经从问题中知道了这一点。假设使用C++11,OP没有提到。@Steve,添加注释:)
std::vector<MobileContract> mobvect = {
MobileContract("planA","0", PhoneModel("800","Blue",900.50)),
MobileContract("planB","1", PhoneModel("750c","Beige",500))
}
std::vector<RoadshowContract> roadshowvect = {
RoadshowContract("planC","2", PhoneModel("2110","Red",1000), 50 ),
RoadshowContract("planA","3", PhoneModel("300","Green",1000), 50)
};
for (int i = 0; i < mobvect .size(); i++) {
mobvect [i].calcPlanPhonePrice();
mobvect [i].display();
cout << "=============================" << endl;
}
for (int i = 0; i < roadshowvect .size(); i++) {
roadshowvect [i].calcPlanPhonePrice();
roadshowvect [i].display();
cout << "=============================" << endl;
}