具有数据成员的抽象基类

Ano*_*ous 5 c++

如果我正在创建一个抽象基类,并且从它派生的类将具有一些相同的数据成员,那么更好的做法是使这些成员在抽象基类中是私有的并给予它们受保护的访问权限吗?或者不打扰,只是将数据成员放在派生类中.这是用C++编写的.

GMa*_*ckG 2

如果数据属于派生类,则让派生类执行其想要包含该数据的操作。

通过将该数据放置在基类中(不是私有的),您可以强制每个派生类都拥有它。例如,不应强迫派生类执行任何操作,除非它们需要填写数据成员。基类定义派生类必须做什么,而不是它们应该如何做。

如果您发现可能存在共同主题,则可以创建一个具有这些成员和实现的派生类,然后将其作为那些想要使用它的人的基类。例如:

struct car
{
    virtual ~car(){}

    virtual unsigned year(void) const = 0;
    virtual const std::string make(void) const = 0;
}

// Dodge cars can feel free to derive from this instead, it's just a helper
struct dodge_car
{
    virtual ~car(){}

    virtual unsigned year(void) const = 0;

    const std::string make(void) const
    {
        static const std::string result = "Dodge";
        return result;
    }

}
Run Code Online (Sandbox Code Playgroud)

等等。但你看,任何派生类仍然可以选择实现整个汽车接口。这也提高了代码的整洁度。通过使您的界面保持真实的界面,实现细节就不会妨碍您。

基类使用的任何变量都应该是私有的,因为派生类不需要知道它是如何工作的,就像派生类的用户不需要知道派生类的内部如何工作一样。