您何时使用每个继承?
class Base{};
class Derived: protected Base{};
class Derived2: public Base{};
我的情况:
我有一个名为Snapshot的类,它只包含GetXXX方法。它是一个轻量级,用于存储Value类的当前状态。我还使用它进行恢复,在Value类实例消失后保持此类的实例很长时间。 Manager类处理Snapshot类的实例。我来告诉你代码:
class Snapshot
{
public:
Snapshot (const Snapshot * snap)
{
_x=snap->_x;
_y=snap->_y;
_z=snap->_z;
}
Snapshot (){_x=_y=_z=0;}
int GetX(){return _x;}
int GetY(){return _y;}
int GetZ(){return _z;}
~virtual Snapshot(){}
protected:
int _x,_y,_z;
};
class Value:public Snapshot
{
/*Very heavy class with a lot of components used to calculate _x, _y, _z*/
};
class Manager
{
public:
void Process( const Snapshot * snap)
{
}
};
您对此设计有何看法?有哪些替代方案?
由于
解决方案和问题
解决方案:我将创建makeSnapshot函数,该函数将通过给定的Value对象返回Snapshot对象。
问题:
主要问题:我经常发送快照(每秒,甚至更少),因此我不想承担构建和销毁成本的小问题:
半主要问题我必须让Value成为Snapshot的朋友,因为我不想要 介绍二传手。
答案 0 :(得分:2)
关于私有和受保护的继承的问题,可以在这里找到非常详尽的解释:
主要问题是语义 - 无论是某种东西是某种东西,还是某种东西都是以某种方式实现的。
答案 1 :(得分:2)
我将创建makeSnapshot函数,该函数将通过给定的Value对象返回Snapshot对象。
你真的需要Value作为快照吗?
你也可以考虑GOF设计模式“Memento”。
答案 2 :(得分:0)
一般来说,如果我想实现特定的接口,我会使用公共继承,例如:如果要通过特定合同访问我的课程。 如果您只想重用父级中实现的功能,则可以使用受保护的继承。
我会将Snapshot设为纯虚拟类,例如只是一个接口,Value将实现getXYZ方法。例如。你可能不需要快照中的_x,_y,_z成员。
答案 3 :(得分:0)
给我看Luddite,但是在20多年的C ++编程中,我从未使用过保护或私有继承,并且从未见过使用其他语言功能(通常是包含)无法更好地使用它们的示例。