我正在研究C ++中的遗产和多态机制,从我的角度来看,我有一个无法解决的问题。
实际上我在猜测,我想念一些非常简单的东西,但我无法弄清楚它是什么。
有人可以帮助我吗?
问题在于:
我有一个名为Article
的基类和一个名为ArticleEnSolde
的派生类,以及一个管理Caddy
表的第三个类Article.Article
只包含string
并且int
和ArticleEnSolde
具有基于百分比的折扣系统。
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;请问有人可以帮我吗?
由于
答案 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());
}