如何从 C++ 基类继承抽象行为
Posted
技术标签:
【中文标题】如何从 C++ 基类继承抽象行为【英文标题】:How to inherit abstract behavior from c++ base class 【发布时间】:2017-10-29 21:52:04 【问题描述】:假设我想在一个由所有派生类继承的基类中实现抽象行为。例如,一个克隆对象的函数,对其应用一些修改并返回克隆和修改的对象(例如转置、复制等)。下面的代码使用了一个更简单的函数,它只返回对象本身:
class Base
public:
virtual Base* yourself ()
return this;
;
class Derived : public Base
public:
...
;
void main()
Derived d;
auto result = d.yourself();
如果我没有遗漏什么,结果将是 Base* 类型,其目的显然是获取 Derived* 类型的对象。
有没有办法让你自己()返回所有派生类的预期值,而不在所有地方重写它(实际上继承的全部意义在于只实现每个行为一次)?
【问题讨论】:
如果你愿意,你可以随时进行向上转型。 是的,你可以使用 addressof 运算符:auto result = &d;
【参考方案1】:
这个问题相当普遍,您可以使用模板来解决它。像这样的:
template <class T>
class Base
public:
virtual T* yourself ()
return dynamic_cast<T*>(this);
;
class Derived : public Base<Derived>
public:
...
;
它被称为Curiously recurring template pattern (CRTP)
【讨论】:
谢谢。有趣的学习。然而,以这种方式硬编码继承正是我试图避免的。在深层类树中,这样的模板会使事情复杂到难以忍受的程度。以上是关于如何从 C++ 基类继承抽象行为的主要内容,如果未能解决你的问题,请参考以下文章