2017-10-19 3 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を使用して、機能を上書きすることができます。あなたのクラスは、次のようなものになります。

class RoadshowContract : public MobileContract 
{ 
private: 
    double rsPhoneDiscount; 
public: 
    RoadshowContract(string planID, string contractID, PhoneModel& phoneModel, double rsPhoneDiscount); 
    double calcPlanPhonePrice() override; 
    void display() override; 
}; 

しかし、あなたのベクトルはMobileContract型です。したがって、呼び出されるメソッドは常にそうです。これを変更するには、ポインタと多相を使用する必要があります。

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:次に、あなたのメインのCPPは次のよ​​うになります。それは簡単です。 MobileContractRoadshowContractの公開ベースクラスであるため、vectスライスRoadshowContractに格納しようとしています。

ポインタを使用する必要がありますが、スマートポインタはオプションです。

0

ご注意:このような方法でポリモーフィックオブジェクトを保存することはできません。代わりにポインタを使用する必要があります。スマートポインタを使用して

あなたが同じベクトルでMobileContractRoadshowContractの両方を保存したい場合は、あなたがまだstd::vector<MobileContract *>以上を使用する必要がstd::vector<std::shared_ptr<MobileContract>>

例は

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以降が必要です)
+0

OPに言及していないC++ 11の使用を想定しています。 – Steve

+0

@Steve、コメントを追加:) –

0

確かに、絶対にポインタを使用したくない場合は(なぜ?)、2つの異なるベクトルを使用してそれを達成できます:

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++のバージョンによっては、範囲ベースのforautoなどを使用するなど、潜在的な改善があります。スマートポインタを使用してください(他の回答に記載されています。

関連する問題