c++ - 如何最好地使用抽象基类作为接口(interface)而不重复兄弟类函数重写

标签 c++ inheritance abstract-class pure-virtual

我有一个抽象接口(interface)Person,它由CustomerSalesPerson继承。 Person 包含两个派生类的每个成员函数的纯虚函数,这些函数需要通过对基类的引用(多态性)相互调用。这允许我解耦我的类型,对吗?

如何阻止我的派生类继承其他派生类的纯虚函数并变得抽象,而不用在整个派生类中使用虚拟非纯虚函数镜像同级类重写函数?

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

最佳答案

你不能。一旦定义了抽象基类,就需要实现其后代中的所有功能。否则编译器不会知道你想做什么。想象一下:

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

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

使用此代码:

Person* p;
p = new Customer();
p.doSales();

现在,p.doSales(); 是一个完全有效的调用,因为您 promise 任何 Person 都有一个 doSales() 方法对吗?

唯一的解决方案是使用空方法而不是抽象方法:

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

关于c++ - 如何最好地使用抽象基类作为接口(interface)而不重复兄弟类函数重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178613/

相关文章:

Java抽象类来实例化其他类

c++ - 类的 Ctor 初始化程序未调用适当的构造函数

c++ - 错误 c2059 : syntax error: '('

c++ - 使用自定义委托(delegate)通过 TableView 编辑 QStandardItemModel

java - JPA:实现模型层次结构 - @MappedSuperclass 与 @Inheritance

C# public class where T : class, Class, new() 混淆

c++ - 如何在 C++ Builder 6 中发送广播消息

java - 接口(interface)和继承 : "return type int is not compatible"

c++ - 派生类可以看到其他派生类的私有(private)成员吗?

java - GNU Smalltalk - 继承和多参数方法/构造函数