【发布时间】:2014-11-30 07:47:29
【问题描述】:
我先解释一下我的情况。
我有一个自动实现一种引用计数的基类。它允许我将 C 风格的 init() 和 free() 库调用包装到引用计数 API。
template<typename T>
class Service {
public:
Service() {
if(s_count++ == 0) {
T::initialize();
}
}
~Service() {
if(--s_count == 0) {
T::terminate();
}
}
private:
static int s_count;
};
template<typename T>
int Service<T>::s_count = 0;
希望实现这些初始化器和终止器的类将派生自Service,如下所示:
class Test : public Service<Test> {
friend class Service<Test>;
private:
static void initialize() {
std::cout << "Initialized" << std::endl;
}
static void terminate() {
std::cout << "Terminated" << std::endl;
}
};
但是,声明很混乱,因为我必须继承自 Service 类并成为其好友。 有没有办法让基类自动访问派生类的受保护或私有成员?如果没有,我不妨问问是否有更好的方法来编写我在这里所做的事情。
【问题讨论】:
-
CRTP 使用完全相同的模式。我认为你的代码很好。
-
@RSahu 很好的参考...但是你认为让基类访问派生类的成员是个好主意吗?
-
@ravi,总的来说,答案是否定的。例外是 CRTP,其中基类显式依赖派生类中的函数。
-
您可能希望将
initialize和terminate设为虚拟。 -
@RSahu 应该命名为“好奇调用模板模式”
标签: c++ inheritance