2

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();
};
4

1 に答える 1