I have a base class and several derived classes. The derived classes use some common data, can I just put those common data as protected member of the base class? I know the protected member breaks encapsulation sometimes, so I wonder if there is any good approach.
Here is a specific example:
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
}
If I put mData into Dr1 and Dr2 as private member, then I need to put it in both of them, and I can not have printData() in Base since printData() need access to mData unless I make printData() virtual and have identical function in both Dr1 and Dr2, which doesn’t make much sense to me.
Is there a better way to approach this without using protected member? Thank you.
One design to consider is making mData private, and adding protected methods to Base that provide common manipulations to the data that can then be used by Dr1 and Dr2.
But there are plenty of times it makes more sense to leave mData as a protected member. The best approach will very much depend on the details of your class.