Person
とによって継承される抽象インターフェイスがCustomer
ありSalesPerson
ます。Person
ベース (ポリモーフィズム) への参照を通じて相互に呼び出す必要がある 2 つの派生クラスのすべてのメンバー関数の純粋仮想関数が含まれています。これにより、型を正しく分離できますか?
派生クラスが他の派生クラスの純粋仮想関数を継承し、派生クラス全体でダミーの非純粋仮想関数を使用して兄弟クラスのオーバーライドされた関数をミラーリングせずに抽象化されるのを防ぐにはどうすればよいですか?
class Person {
public:
virtual int const GetNumberOfPurchases() const = 0;
virtual long const GetId() const = 0;
virtual void AddPurchase() = 0;
virtual void DisplayCustomerDetails() const = 0;
virtual void DisplaySalesPersonStats() = 0;
virtual void SetContact(Person * SalesP) = 0;
};
class SalesPerson: public Person {
private:
long const id; // Assumption: Sales people never change their ID
Person *bestCustomer;
Person *worstCustomer;
vector<Person *> v_Client;
virtual int const GetNumberOfPurchases() const { return 0; }; // dummy to avoid inheriting pure virtual function
virtual void AddPurchase() {}
virtual void DisplayCustomerDetails() const {}
virtual void SetContact(Person * SalesP) {}
public:
SalesPerson();
virtual ~SalesPerson(){};
Person const *GetBestCustomer() const;
Person const *GetWorstCustomer() const;
virtual long const GetId() const { return id; }
void DisplaySalesPersonStats();
float const CalculateMeanAverageSales();
void SignUpCustomer(Person * aCustomer);
void RegisterSale(long customerId);
void CalculateBestAndWorstCustomers();
void DisplayClientList();
long GenerateSalesPersonKey();
};
class Customer: public Person{
private:
long ID;
int birthYear;
bool isCurrentMember;
unsigned numberOfPurchases;
const Person *contact; // Assumption: Each Customer has a single assigned contact SalesPerson
virtual void DisplaySalesPersonStats() {} // Dummy to avoid inheriting pure virtual from Person
public:
Customer(const int aBirthYear);
virtual ~Customer() {}
virtual long const GetId() const;
int const GetBirthYear() const;
void SetBirthYear(int aBirthYear);
bool const GetIsCurrentMember() const;
void ToggleIsCurrentMember();
virtual int const GetNumberOfPurchases() const;
virtual void AddPurchase();
virtual void DisplayCustomerDetails() const;
virtual void SetContact(Person * SalesP);
long GenerateCustomerKey();
};