在我目前的代码中,我有一个TNCPConnection
类,它派生自enable_shared_from_this
:
class TNCPConnection : public boost::enable_shared_from_this<TNCPConnection> { ... };
现在我需要创建第二个类ETCPConnection
,它将与现有的TNCPConnection
类共享大量代码。因此,显而易见的解决方案是使用抽象基类CPConnectionBase
来实现常用功能。
我知道继承层次结构中只有一个类可以派生自enable_shared_from_this
。在寻找解决方案时,我偶然发现了CRTP模式,但我不确定我是否正确理解了这一点。这是我的方法:
template <class Derived>
class CPConnectionBase : public boost::enable_shared_from_this<Derived>
{
public:
CPConnectionBase(void) { }
virtual ~CPConnectionBase(void) = 0 { }
};
class TNCPConnection : public CPConnectionBase<TNCPConnection> { ... };
class ETCPConnection : public CPConnectionBase<ETCPConnection> { ... };
这是解决问题的正确方法吗?使用这种方法可以正确引用计数吗?特别是我想知道enable_shared_from_this
的模板参数是否必须是Derived
(如上例所示)或CPConnectionBase<Derived>
之类的内容?
答案 0 :(得分:2)
如果使用该方法,则每个派生类都将拥有自己的唯一基类。尽管它们具有相同的名称,但它们将是不同的实例。您确定从enable_shared_from_this
继承的基类不会为所有孩子提供这种能力吗?
此外,which will share a lot of code with the existing ... class.
不是使用继承的直接指标。一般来说,继承要扩展,而不是重用。如果所有基类都实现了通用功能,但没有为这两个类提供通用接口,那么您应该重新考虑这种方法。使用组合和委托到公共方法,或者,如果它们没有连续状态,则将公共代码放入(可能是匿名的)名称空间,并从您需要的实际功能类中调用它们。您没有提供足够的信息来确定您正在尝试做什么。