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();

cout
vect
存储
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;
}