假设我想在所有派生类继承的基类中实现抽象行为。例如,克隆对象的函数对其应用一些修改并返回克隆和修改的对象(例如转置,复制等)。下面的代码使用一个更简单的函数,它只返回对象本身:
class Base
{
public:
virtual Base* yourself ()
{
return this;
}
};
class Derived : public Base
{
public:
...
};
void main()
{
Derived d;
auto result = d.yourself();
}
如果我没有遗漏某些内容,结果将是Base *类型,其中的目的显然是获取Derived *类型的对象。
有没有办法让自己()返回所有派生类的预期值而不在所有地方覆盖它(实际上,整个继承点只是实现每个行为一次)?
答案 0 :(得分:3)
此问题相当常见,您可以使用模板解决此问题。像这样:
template <class T>
class Base
{
public:
virtual T* yourself ()
{
return dynamic_cast<T*>(this);
}
};
class Derived : public Base<Derived>
{
public:
...
};