如何从 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++ 基类继承抽象行为的主要内容,如果未能解决你的问题,请参考以下文章

如何从用 C# 编写的抽象基类继承

奇怪的指针行为 C++ / 继承

从两个抽象类继承,其中一个也需要另一个基类的一部分

如何制作所有从一个基类继承的对象列表

从抽象基类构造函数创建继承类的实例

Java 继承