在我当前的代码中,我有一个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>
的东西? 最佳答案
如果使用该方法,则每个派生类将具有自己的唯一基类。即使它们具有相同的名称,它们也将是不同的实例。您确定让基类继承自enable_shared_from_this
不会为所有子项提供此功能吗?
另外,which will share a lot of code with the existing ... class.
并不是使用继承的直接指示器。通常,继承是扩展,而不是重用。如果所有基类都实现了通用功能,但没有为这两个类提供通用接口(interface),则您可能应该重新考虑该方法。可以使用组合和委托(delegate)通用方法,或者,如果它们不具有连续状态,则将通用代码放入(可能是匿名的) namespace 中,并从所需的实际功能类中调用它们。您没有提供足够的信息来确定您要尝试执行的操作。
关于c++ - CRTP模式和enable_shared_from_this,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9081029/