我正在研究C++中的遺傳和多態機制,從我的角度來看,我有一個不可解決的問題。
其實我猜測,我錯過了很簡單的事情,但我無法弄清楚它是什麼。
有人可以幫我嗎?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;
}
我想有底「獎金總計24「而不是27請有人可以幫助我?
感謝
你的意思是[「繼承」(http://ell.stackexchange.com/questions/22529 /遺產和繼承)。 –
是的,我不知道有什麼區別 – kevin556
您的ArticleEnSolde :: getPrix()是有點遞歸(幸運的是它不是真的叫)......你爲什麼不使用成員變量? –