2017-10-19 62 views
-1
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和显示从基类被调用。我需要从它们的特定类型中调用它们。我怎么做?另外如果可能,避免使用指针

回答

-1

您可以使用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; 
} 
+0

请注意,这是[tag:C++ 11]功能。 – iBug

+2

'override'主要是评论。编译器会检查它是否正确,但它只是告诉读者,重写的函数存在于基类中。我们已经知道这个问题。 – MSalters

4

vectMobileContract,不RoadshowContract。这很简单。由于MobileContract是公共基本类RoadshowContract,试图将它们存储在vectRoadshowContract

必须使用指针,但智能指针是一个选项。

0

请小心:您不能以这种方式存储多态对象,您必须改用指针!

如果你想既MobileContractRoadshowContract存储在同一载体中,你必须使用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; 
} 
+0

假设使用C++ 11,OP没有提到。 – Steve

+0

@Steve,添加评论:) –

0

如果您肯定,绝对不想使用指针(为什么?),您可以使用两个不同的矢量来完成它:

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等。或者使用智能指针,如其他答案中所述(不确定是否按照您的意愿对其进行分类使用指针)