2016-06-14 16 views
-4

私はC++の遺産と多型の仕組みに取り組んでいます。私は私の観点からは決して問題がありません。
実際に私は推測している、私は何かが非常にシンプルに恋しいですが、私はそれが何であるか理解できません。
誰かが私を助けてくれますか?ここでC++一般的な継承の誤解

は問題です:

私はArticleという名前の基本クラスを持っているとArticle.Articleのテーブルを管理ArticleEnSoldeという名前の派生クラスと、第三のクラスCaddyのみstringintArticleEnSolde割引制度がありますが含まれていますパーセンテージに基づいて

CaddyにはArticleテーブルのみが含まれ、商品価格の合計を返すprixTotal()というメソッドがあります。
しかし、私はどのようにしてオブジェクトがすべてと見なされるのかを把握することはできませんが、ArticleEnSolde`とはみなされません。
合計が正しくありません。ここで

はここ
#include "ArticleEnSolde.hpp" 


ArticleEnSolde::ArticleEnSolde(string s,float f,float i):Article(s,f),remise(i){} 

float ArticleEnSolde::get_remise() const{ 
    return this->remise; 
} 

void ArticleEnSolde::set_remise(float r){ 
    this->remise = r; 
} 

float ArticleEnSolde::getPrix(){ 
    cout << "ArticleEnSolde " << endl; 
    Article * p = this; 
    return p->getPrix() * (1 - this->get_remise()); 
} 

ostream& operator<<(ostream& o ,ArticleEnSolde& a){ 
    Article * p = &a; 
    o <<"nom ArticleEnSolde " << p->get_nom() << " prix : " << p->getPrix() << " remise : " << a.get_remise() << " prix apres reduction " << a.getPrix(); 
    return o; 
} 
ArticleEnSolde.cpp

ここ
#include "Article.hpp" 
#pragma once 

class ArticleEnSolde : public Article{ 

private: 
    float remise; 

public: 
    ArticleEnSolde(string,float,float); 
    float get_remise() const; 
    void set_remise(float); 
    float getPrix(); 
    friend ostream& operator<<(ostream&,ArticleEnSolde&); 
}; 

ArticleEnSolde.hpp

ここ
#include "Article.hpp" 

Article::Article(string n,float p):nom(n),prix(p){} 

void Article::set_nom(string s){ 
    this->nom = s; 
} 

void Article::set_prix(float p){ 
    this->prix = p; 
} 

string Article::get_nom() const{ 
    return this->nom; 
} 

float Article::getPrix() const{ 
    return this->prix; 
} 

ostream& operator<<(ostream& o ,Article& a){ 
    o << "nom article : " << a.get_nom() << " prix : " << a.getPrix(); 
    return o; 
} 

Article::~Article(){ 
    cout << "appel du destructeur d'article " << endl; 
} 

Article.cpp

されている
#include <iostream> 
#pragma once 

using namespace std; 

class Article{ 
private: 
    string nom; 
    float prix; 

public: 
    Article(string = "vide",float = -44.6); 
    void set_nom(string); 
    void set_prix(float); 
    string get_nom() const; 
    virtual float getPrix() const; 
    friend ostream& operator<<(ostream&,Article&); 
    virtual ~Article(); 
}; 

Article.hpp

ですここで

ここCaddy.hpp

#include "Article.hpp" 
#include "ArticleEnSolde.hpp" 

class Caddy{ 
private: 
    Article ** tableau; 
    int index; 
    int taille_max; 

public: 
    Caddy(int); 
    Article** get_tab(); 
    int get_index() const; 
    void set_index(int); 
    int get_taille_max() const; 
    Article* get_article(int); 
    void add_article(Article&); 
    float prixTotal(); 
    friend ostream& operator<<(ostream&,Caddy&); 
// ~Caddy(); 
}; 

あるCaddy.cpp

#include "Caddy.hpp" 

Caddy::Caddy(int i):taille_max(i),index(0){ 
    tableau = new Article *[i]; 
} 

Article** Caddy::get_tab(){ 
    return this->tableau; 
} 

int Caddy::get_index() const{ 
    return this->index; 
} 

void Caddy::set_index(int a){ 
    this->index = a; 
} 

int Caddy::get_taille_max() const{ 
    return this->taille_max; 
} 

Article* Caddy::get_article(int a){ 
    return this->tableau[a]; 
} 

void Caddy::add_article(Article& a){ 
    if(this->index <this->taille_max){ 
     cout << "inferieur" << endl; 
     this->tableau[this->index++] = &a; 
     cout << "ajout reussi" << endl; 
     cout << this->index << endl; 
    } 
    else{ 
     cout << "ajout refuse " << endl; 
    } 
} 

float Caddy::prixTotal(){ 
    float somme = 0; 
    for(int i =0;i<this->get_index();i++){ 
     cout << this->get_tab()[i]->getPrix() << endl; 
    } 
    return somme; 
} 

ostream& operator<<(ostream& o,Caddy& c){ 

    for(int i = 0 ;i<c.get_index();i++){ 
     o << "Case " << i <<" " << c.get_tab()[i] << endl; 
    } 
    return o; 
} 

/* 
    Caddy::~Caddy(){ 
     cout << "appel du destructeur " << endl; 
     for(int i = 0 ; i < this->get_index();i++){ 
      this->get_tab()[i].~Article(); 
     } 
    }  
*/ 

され、最終的にここでの主なコードである:「私は終わりにしたい

#include "Article.hpp" 
#include "ArticleEnSolde.hpp" 
#include "Caddy.hpp" 

int main(){ 
    Article a("a",12); 
    ArticleEnSolde b("b",15,0.2); 
    cout << a << endl; 
    cout << b << endl; 
    Caddy c(2); 
    c.add_article(a); 
    c.add_article(b); 
    cout << c << endl; 
    cout << "prix total : " << c.prixTotal() << endl; 
} 

は、賞金合計24 "の代わりに27誰かが私を助けることができますか?

おかげで一見

+0

あなたは意味[「継承」](http://ell.stackexchange.com/questions/22529 /遺産と継承)。 –

+0

はい違いがあったのは分かりませんでした – kevin556

+2

ArticleEnSolde :: getPrix()はちょっと再帰的です(幸いにも実際には呼び出されません)...代わりにメンバーのveariablesを使用してみませんか? –

答えて

2

、問題はあなたが本当にgetPrix()をオーバーライドしていない、であるように見えます。 Article

virtual float getPrix() const; 

ArticleEnSoldeで:

float getPrix(); 

差があり、一つはconstですが、他ではありませんので、彼らは実際には同じ方法ではありません! constの両方を作成してください。また、.cppファイル内のメソッド定義にconstを追加することも忘れないでください。


そして、あなたは(あなたがすべき)現代のC++コンパイラを使用している、あなたがオーバーライドArticleEnSolde方法にC++ 11 overrideキーワードを追加していたと仮定すると:そして、あなたがコンパイラを得ているでしょう

float getPrix() const override; 

constが見つからなかった場合はエラーになります(これは上書きされていないためです)。


そして、あなたはそれが固定得れば、あなたはここに再帰を修正する必要があります。

float ArticleEnSolde::getPrix() const { 
    cout << "ArticleEnSolde " << endl; 
    // pointless: Article * p = this; 
    // infinite recursion: return getPrix() * (1 - this->get_remise()); 
    // Here's how you call superclass method explicitly: 
    return Article::getPrix() * (1 - this->get_remise()); 
} 
+2

さらに、オーバーライド宣言に 'override'を追加してください。 –

+0

@KerrekSBそれを指摘してくれてありがとう、編集しました。 – hyde

+0

みなさんありがとう – kevin556

関連する問題