2013-08-12 4 views
2

CustomerSalesPerson에 상속 된 Person 추상 인터페이스가 있습니다. Person에는 기본 참조 (다형성)를 통해 서로 호출해야하는 두 파생 클래스의 모든 멤버 함수에 대한 순수 가상 함수가 들어 있습니다. 이렇게하면 내 유형을 올바르게 분리 할 수 ​​있습니까?형제 클래스를 복제하지 않고 인터페이스로 추상 기본 클래스를 사용하는 방법 function override

다른 파생 클래스의 순수 가상 함수를 상속하고 파생 클래스 전체에서 더미 순수하지 않은 가상 함수로 형제 클래스 재정의 함수를 미러링하지 않고 파생 클래스를 중단하는 방법은 무엇입니까?

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

:

유일한 해결책은 대신 추상적 인 것들의 빈 방법을 사용하는 것입니다. – paddy

+0

1 초의 논. 감사합니다. – hally9k

답변

2

수 없습니다. 일단 추상 기본 클래스를 정의하면 자손에 모든 함수를 구현해야합니다. 그렇지 않으면 컴파일러는 사용자가 원하는 것을 모릅니다. 상상 :

class Person 
{ 
public: 
    virtual void beCustomer() = 0; 
    virtual void doSales() = 0; 
}; 

class Customer : public Person 
{ 
public: 
    virtual void beCustomer() { doStuff(); } 
} 

를이 코드 :

지금, p.doSales();이 완벽하게 유효한 전화입니다
Person* p; 
p = new Customer(); 
p.doSales(); 

, 당신이 어떤 PersondoSales() 방법 권리가 있다고 약속 때문에? 당신을 아주 ... 작은 코드 조각이 천 단어를 구사 다음하지

class Person 
{ 
public: 
    virtual void beCustomer() {}; 
    virtual void doSales() {}; 
}; 
+2

다시 한번 감사드립니다. 나는 그것을들을 필요가 있었다. 나는이 답에 +1을 주 겠지만 아직 +1 할 점수가 충분하지 않습니다. 시간 내 주셔서 감사합니다. – hally9k

+0

대신에 +1하겠습니다. P –