基类中的常见受保护数据成员?

EXP*_*XP0 6 c++

我有一个基类和几个派生类.派生类使用一些常见数据,我可以将这些常用数据作为基类的受保护成员吗?我知道受保护的成员有时会破坏封装,所以我想知道是否有任何好的方法.

这是一个具体的例子:

class Base{
public:
   virtual void foo() = 0;
   void printData();
protected:
   std::vector<std::string> mData;
}

class Dr1 : public Base{
public:
   virtual void foo(); //could change mData
}

class Dr2 : public Base{
public:
   virtual void foo(); //could change mData
}
Run Code Online (Sandbox Code Playgroud)

如果我将mData作为私有成员放入Dr1和Dr2中,那么我需要将它放在两个中,并且我不能在Base中使用printData(),因为printData()需要访问mData,除非我使printData()虚拟并且Dr1和Dr2中的功能相同,这对我来说没什么意义.

有没有更好的方法来解决这个问题而不使用受保护的成员?谢谢.

Jer*_*fin 9

这是有争议的.允许数据protected被添加到C++主要是因为Mark Linton想要它用于他正在设计的Interviews Windowing库.它似乎与C++的其他设计相当合适,所以(显然)Bjarne赞同这个想法.几年后,Mark禁止在Interviews中使用受保护的数据成员,因为使用它们会导致错误的数量.在此之后的一段时间,Barbara Liskov就整个概念提出了理论和实际问题.

在C++的设计和演变中,Bjarne得出结论:"回想起来,我认为这protected是一个案例,我让'好的论据'和时尚克服了我更好的判断和我接受新功能的经验法则."

结论:我对制作数据有第二和第三个想法protected.现在看起来可能是一个好主意,但维护可能是一个相当不同的故事.


use*_*715 3

需要考虑的一种设计是将 mData 设为私有,并向 Base 添加受保护的方法,这些方法为 Dr1 和 Dr2 可以使用的数据提供通用操作。

但很多时候,将 mData 保留为受保护成员更有意义。最好的方法在很大程度上取决于你的课程的细节。