C++如何获取调用的正确方法?
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();
};
然后,在我的主文件:C++如何获取调用的正确方法?
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;
}
calcPlanPhonePrice和显示从基类被调用。我需要从它们的特定类型中调用它们。我怎么做?另外如果可能,避免使用指针
您可以使用override
来确保覆盖功能。然后你inhereited类将是这样的:
class RoadshowContract : public MobileContract
{
private:
double rsPhoneDiscount;
public:
RoadshowContract(string planID, string contractID, PhoneModel& phoneModel, double rsPhoneDiscount);
double calcPlanPhonePrice() override;
void display() override;
};
然而,你的矢量型MobileContract,因此,调用的方法将总是。要改变这个,你必须使用指针和多态。然后,你的主CPP将是这样的:
std::vector<MobileContract*> vect = {
new MobileContract("planA","0"),
new MobileContract("planB","1"),
new RoadshowContract("planC","2", 50),
new RoadshowContract("planA","3", 50)
};
for (int i = 0; i < vect.size(); i++) {
vect[i]->calcPlanPhonePrice();
vect[i]->display();
cout << "=============================" << endl;
}
vect
店MobileContract
,不RoadshowContract
。这很简单。由于MobileContract
是公共基本类RoadshowContract
,试图将它们存储在vect
片的RoadshowContract
。
您必须使用指针,但智能指针是一个选项。
请小心:您不能以这种方式存储多态对象,您必须改用指针!
如果你想既MobileContract
和RoadshowContract
存储在同一载体中,你必须使用std::vector<MobileContract *>
或更好,但使用智能指针std::vector<std::shared_ptr<MobileContract>>
实例(需要C++ 11或更高版本)
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;
}
假设使用C++ 11,OP没有提到。 – Steve
@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;
}
注意取决于您使用的是哪个版本的C++,有可能的改进,例如使用基于范围的for
,auto
等。或者使用智能指针,如其他答案中所述(不确定是否按照您的意愿对其进行分类使用指针)
请注意,这是[tag:C++ 11]功能。 – iBug
'override'主要是评论。编译器会检查它是否正确,但它只是告诉读者,重写的函数存在于基类中。我们已经知道这个问题。 – MSalters