在 C++ 入门 15.8 中,当作者谈到“句柄类和继承”时,他说:
C++ 中的一种常用技术是定义所谓的覆盖类或句柄类。句柄类存储和管理指向基类的指针。该指针指向的对象的类型会有所不同;它可以指向基类或派生类对象。用户通过句柄访问继承层次结构的操作。因为句柄使用它的指针来执行这些操作,所以虚拟成员的行为在运行时会根据句柄实际绑定到的对象的类型而有所不同。句柄的用户因此获得动态行为,但他们自己不必担心管理指针。
以上听起来很像我的智能指针。但是,这个“句柄”的用法有点不同。
Handle h(Derived()); // noticed a derived object, not a pointer is used to initialize the handle!
h->func();
句柄的后一种实现(如下所示)证明了作者对句柄的评论:
我们希望我们的句柄的用户创建他们自己的对象,他们可以附加一个句柄。句柄将分配适当类型的新对象并将用户的对象复制到新分配的对象中。这样,句柄类将拥有该对象,并且可以保证在附加到该对象的最后一个句柄消失之前不会删除该对象。
代码:
public:
Base(){}
virtual int func(std::size_t n) const {}
virtual Base* clone() const { return new Base(*this); }
};
class Derived : public Base {
public:
Derived():Base(){}
int func(std::size_t) const; // redefine
Derived* clone() const { return new Derived(*this); }
};
class Handle {
public:
Handle(const Base &b):p(b.clone()), use(new std::size_t(1)) { }
private:
Base *p;
std::size_t *use; // pointer to shared use count
};
我的问题是:这真的是 C++ 或 OO 中句柄的典型含义吗?我认为句柄可以只是一个基本类型的智能指针,它在内部保持使用计数,或者更一般地说,系统知道它指向什么以及如何处理它的一些魔法 int 类型。为什么这里的句柄需要将用户对象复制到自身,然后根据副本进行使用计数?