2017-10-21 8 views
-3

私は多重継承に問題があります。多重継承問題C++

#pragma once 
#include <iostream> 
#include <list> 
class Data { 
protected: 
    int year; 
    int month; 
    int day; 
public: 
    Data(); 
    Data(int, int, int); 
    void show(); 
}; 

class Person : virtual public Data { 
protected: 
    std::string Name; 
    std::string Sur_name; 
public: 
    Person(); 
    Person(std::string, std::string, int, int, int); 
    void show(); 
}; 

class Waiter : public Person { 
protected: 
    int category; 
public: 
    Waiter(); 
    Waiter(std::string, std::string, int d, int m, int y, int c); 
    void show(); 
}; 

class TypeOfDish { 
protected: 
    std::string typeDish; 
public: 
    TypeOfDish(); 
    TypeOfDish(std::string); 
    void show(); 
}; 

class Course : public TypeOfDish { 
protected: 
    double price; 
    std::string NameofCourse; 
public: 
    Course(); 
    Course(std::string, double, std::string); 
    void show(); 
}; 

class Order : public Course, public Waiter, virtual public Data{ 
public: 
    Order(); 
    void show(); 
}; 

////////////////////////////////////////

#include "stdafx.h" 
#include "Class.h" 
#include <string> 
Data::Data() { 
    day = 21; 
    month = 10; 
    year = 2017; 
} 
Data::Data(int d, int m, int y) { 
    this->day = d; 
    this->month = m; 
    this->year = y; 
} 

void Data::show() { 
    std::cout << "Hello from Data.Date of birth " << day << " " << month << " " << year << std::endl; 
} 

Person::Person() : Data() { 
    day = 22; 
    month = 10; 
    year = 2017; 
    Name = "Ivan"; 
    Sur_name = "Petrov"; 
} 

Person::Person(std::string n, std::string s, int d, int m, int y) : Data(d,m,y) { 
    this->Name = n; 
    this->Sur_name = s; 
} 

void Person::show() { 
    std::cout << "Hello from Person " << Name << " " << Sur_name << std::endl; 
    std::cout << "Hello from Person.Date of birth " << day << " " << month << " " << year << std::endl; 
} 

Waiter::Waiter() : Person() { 
    category = 3; 
} 
Waiter::Waiter(std::string n, std::string s, int d, int m, int y, int c) : Person(n,s,d,m,y) { 
    this->category = c; 
} 

void Waiter::show() { 
    std::cout << "Hello from Waiter " << Name << " " << Sur_name << std::endl; 
    std::cout << "Hello from Waiter.Date of birth " << day << " " << month << " " << year << std::endl; 
    std::cout << "Hello from Waiter.Category " << category << std::endl; 
} 

TypeOfDish::TypeOfDish() { 
    typeDish = ""; 
} 
TypeOfDish::TypeOfDish(std::string type) { 
    this->typeDish = type; 
} 
void TypeOfDish::show() { 
    std::cout << "The type of dish is " << typeDish << std::endl; 
} 

Course::Course() : TypeOfDish() { 
    price = 12.32; 
    NameofCourse = "Borsh"; 
} 

Course::Course(std::string name, double pri, std::string type) : TypeOfDish(type) { 
    this->NameofCourse = name; 
    this->price = pri; 
} 

void Course::show() { 
    std::cout << typeDish << ":" << NameofCourse << std::endl; 
} 

Order::Order() : Data(), Course(), Waiter() { 
    std::cout << "."; 
} 

void Order::show() { 
    std::cout << "Hello from Order " << Name << " " << Sur_name << std::endl; 
    std::cout << "Hello from Order.Date of birth " << Waiter::day << " " << Waiter::month << " " << Waiter::year << std::endl; 
    std::cout << "Hello from Order.Category " << category << std::endl; 
    std::cout << "Hello from Order.Date of order " << day << " " << month << " " << year << std::endl; 
    std::cout << "Hello from Order" << typeDish << ":" << NameofCourse << std::endl; 
} 

私は3つの基本的なクラス - ウェイター、コースとデータ、派生命令を持っています。 ウェイター、コース、データから画面上のすべてのフィールドを見たい。 私は名前、姓、カテゴリ、ウェイターからの生年月日、コースからのすべてのフィールド、そして最も重要な注文データを意味します。 私はプログラムを実行するとすべてが正常ですが、それは私が望むように動作しません。 生年月日と注文日の同じデータ。

私はこの問題をどのように解決できるか知りたいと思います。

いずれの解決策も高く評価されます。ありがとう。

+0

私は、正確に何が問題であるかを知ることは役に立ちます。 「すべてがうまくいきます」と答えた後、「好きなように動作しません」と言うと、困ってしまいます。 – kabanus

+0

人は日付ですか?あなたのクラスデザインを再考してください。 –

+0

私は@ manni66に同意します。多くのクラスは、他のクラスとは関連していません。注文**はウェイターではなく、**デイトではありません。 – HJuls2

答えて

1

仮想継承を使用しているため、スコープ解決を使用するかどうかにかかわらず、Orderのインスタンスには1か月の年のデータが1セットしかありません。

したがって、Order :: showでは、 "Waiter :: day"と "day"は同じデータを参照しています。

この構造を維持する場合は、仮想継承を削除し、Orderの各インスタンスには別々のデータインスタンスが含まれます。スコープの解像度を使用してそれらを区別するようにしてください。

しかし、あなたの継承スキームはあまり良くないと思います。私はオーダー "isa"コースまたはウェイターとは思わない。これは「hasa」関係にする必要があります。つまり、CourseまたはWaiterから継承する代わりに、Orderにはそのタイプのメンバー変数が含まれている必要があります。