我有一个基类和几个派生类.派生类使用一些常见数据,我可以将这些常用数据作为基类的受保护成员吗?我知道受保护的成员有时会破坏封装,所以我想知道是否有任何好的方法.
这是一个具体的例子:
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中的功能相同,这对我来说没什么意义.
有没有更好的方法来解决这个问题而不使用受保护的成员?谢谢.
这是有争议的.允许数据protected被添加到C++主要是因为Mark Linton想要它用于他正在设计的Interviews Windowing库.它似乎与C++的其他设计相当合适,所以(显然)Bjarne赞同这个想法.几年后,Mark禁止在Interviews中使用受保护的数据成员,因为使用它们会导致错误的数量.在此之后的一段时间,Barbara Liskov就整个概念提出了理论和实际问题.
在C++的设计和演变中,Bjarne得出结论:"回想起来,我认为这protected是一个案例,我让'好的论据'和时尚克服了我更好的判断和我接受新功能的经验法则."
结论:我对制作数据有第二和第三个想法protected.现在看起来可能是一个好主意,但维护可能是一个相当不同的故事.
需要考虑的一种设计是将 mData 设为私有,并向 Base 添加受保护的方法,这些方法为 Dr1 和 Dr2 可以使用的数据提供通用操作。
但很多时候,将 mData 保留为受保护成员更有意义。最好的方法在很大程度上取决于你的课程的细节。
| 归档时间: |
|
| 查看次数: |
1237 次 |
| 最近记录: |