2016-06-14 44 views
-4

我正在研究C++中的遺傳和多態機制,從我的角度來看,我有一個不可解決的問題。
其實我猜測,我錯過了很簡單的事情,但我無法弄清楚它是什麼。
有人可以幫我嗎?C++一般繼承誤解

這裏的問題是:

我有一個基類命名爲Article和命名ArticleEnSolde派生類和第三類Caddy誰管理的Article.Article表格只包含一個stringintArticleEnSolde有折扣制度基於百分比。

Caddy只包含Article表,並有一個名爲prixTotal()的方法,該方法返回文章價格的總和。
但我不知道如何,但所有的對象被認爲是Article而不是被視爲ArticleEnSolde`。
總金額不正確。

這裏是Article.hpp

#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.cpp

#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; 
} 

在這裏被ArticleEnSolde.hpp

#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.cpp

#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; 
} 

這裏是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()是有點遞歸(幸運的是它不是真的叫)......你爲什麼不使用成員變量? –

回答

2

一目瞭然,貌似問題是,你並沒有真正覆蓋getPrix()

Article

virtual float getPrix() const; 

ArticleEnSolde

float getPrix(); 

的區別在於,一個是const,但其他沒有,所以他們實際上不是同樣的方法!使兩個const和那應該解決這個問題。另外,請記住在.cpp文件中也添加const方法定義。


而且假設你使用的是最新的C++編譯器(你應該),你可能會增加C++ 11 override關鍵字的重寫ArticleEnSolde方法:

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