C ++一般继承误解

时间:2016-06-14 18:12:03

标签: c++ polymorphism

我正在研究C ++中的遗产和多态机制,从我的角度来看,我有一个无法解决的问题。
实际上我在猜测,我想念一些非常简单的东西,但我无法弄清楚它是什么。
有人可以帮助我吗?

问题在于:

我有一个名为Article的基类和一个名为ArticleEnSolde的派生类,以及一个管理Caddy表的第三个类Article.Article只包含string并且intArticleEnSolde具有基于百分比的折扣系统。

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

我想在最后&#34; prix总计24&#34;请问有人可以帮我吗?

由于

1 个答案:

答案 0 :(得分:2)

乍一看,看起来问题是,你并没有真正压倒getPrix()

Article

virtual float getPrix() const;

ArticleEnSolde

float getPrix();

区别在于,一个是const,但是其他的不是,所以它们实际上并不是同一个方法!同时制作const和那个应该解决的问题。另外,请记住在.cpp文件中添加const方法定义。

假设您使用的是现代C ++编译器(您应该),您可以在覆盖override方法中添加C ++ 11 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());
}