c++ - 从基类方法返回对派生类的引用

标签 c++ inheritance

我的任务是实现一个简单的 SVG 生成器。我需要支持 Circle、Polyline 和 Text。这三者至少有 4 个共同的方法: - 设置描边颜色 - 设置填充颜色 - 设置描边宽度 - 到字符串 主要要求之一是支持链接,例如: 折线{}.SetStrokeColor("白色").SetFillColor("黑色")...

我决定实现一个基类 Element,所有其他类都继承自该基类。这个想法是有一个类 Document 来保存添加到文档中的所有元素的 vector 。 基本方法的示例签名:

// source of trouble
Element &SetStrokeColor(const Color &color) {
    ...
    return *this;
}

我的派生类确实调用了这些方法,但问题是这些方法返回对基类 Element 的引用,而不是派生类。

我的问题是是否可以一起用c++实现???

Further discussion here

最佳答案

如果您想共享实现保留类型信息,CRTP 就是您所需要的:

struct ElementBase { };

template <class Concrete>
struct Element : ElementBase {

    Concrete &setStrokeWidth(int width) {
        // Actual implementation...
        (void) width;

        return cthis();
    }

private:
    friend Concrete;
    Element() = default;

    Concrete &cthis() { return static_cast<Concrete &>(*this); }
    Concrete &cthis() const { return static_cast<Concrete const &>(*this); }
};

struct Circle : Element<Circle> {
    Circle &SetCircleCenter(int x, int y) {
        // Actual implementation...
        (void) x;
        (void) y;

        return *this;
    }
};

int main() {
    Circle c;
    c.setStrokeWidth(4).SetCircleCenter(0, 0);
}

See it live on Wandbox

关于c++ - 从基类方法返回对派生类的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423269/

相关文章:

c++ - 在构造函数中分配一个数组

c++ - 什么是合成构造函数?

javascript - functionName() 和 functionName.call(this) 之间的区别

c++ - 用整数哈希替换字符串名称的一些好方法是什么

c++ - vector<shared_ptr<Foo>> 到 vector<shared_ptr<const Foo>> 的隐式转换

c# - 实现内部接口(interface)的公共(public)抽象类中的抽象方法无法编译?

c++ - 派生 basic_ostream : "using" keyword and ambiguous overload for operator <<

vb.net - 接口(interface)需要继承基类

c# - 在 C# 中访问重写的公共(public)属性

c++ - 什么 C++ 类型用于最快的 "for cycles"?