在我当前的代码中,我有一个 TNCPConnection
派生自 enable_shared_from_this
的类:
class TNCPConnection : public boost::enable_shared_from_this<TNCPConnection> { ... };
现在我需要创建第二个类 ETCPConnection
这将与现有的 TNCPConnection
共享大量代码类(class)。所以显而易见的解决方案是有一个抽象基类 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
不会为所有子级提供该功能吗?
此外,将与现有的...类共享大量代码。
不是使用继承的直接指示。一般来说,继承是为了扩展,而不是为了重用。如果基类所做的只是实现通用功能但不为这两个类提供通用接口(interface),您可能应该重新考虑该方法。要么对通用方法使用组合和委托(delegate),要么,如果它们没有连续状态,则将通用代码放入(可能是匿名的) namespace 并从您需要的实际功能类中调用它们。您没有提供足够的信息来确定您要做什么。
关于c++ - CRTP 模式和 enable_shared_from_this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9081029/