#include <iostream>class AbstractElement;class ConcreteElement;class SuperConcreteElement;class B{public: voID bar(AbstractElement*) { std::cout << "Abstract element" << std::endl; } voID bar(ConcreteElement*) { std::cout << "Concrete element" << std::endl; } voID bar(SuperConcreteElement*) { std::cout << "Super concrete element" << std::endl; }};class AbstractElement{public: virtual voID foo() = 0;};class ConcreteElement : public AbstractElement{private: B _b;public: voID foo() { _b.bar(this); //1 }};class SuperConcreteElement : public AbstractElement{private: B _b;public: voID foo() { _b.bar(this); //2 }};int main(){ AbstractElement *e = new ConcreteElement(); e -> foo(); //Prints Concrete element}
正如您在// 1和// 2中看到的那样,函数的主体完全相似.但由于依赖于静态类型,我无法将其移动到基类中.尽管如此,每次我需要添加一个AbstractElement的子类时,我不想写完全相同的代码.所以,我需要某种机制,为我们提供将代码注入函数的工具.
只要马科斯不是非常理想的解决方案,我想问一下在C 14中可以用来解决这个问题的一些技巧.
解决方法 是的,可以使用 CRTP:#include <iostream>class AbstractElement;class ConcreteElement;class SuperConcreteElement;class B{public: voID bar(AbstractElement*) { std::cout << "Abstract element" << std::endl; } voID bar(ConcreteElement*) { std::cout << "Concrete element" << std::endl; } voID bar(SuperConcreteElement*) { std::cout << "Super concrete element" << std::endl; }};class AbstractElement{public: virtual voID foo() = 0;};template <class T>class CRTPAbstractElement : public AbstractElement{ B _b;public: virtual voID foo() { T* t = dynamic_cast<T *>(this); _b.bar(t); }};class ConcreteElement : public CRTPAbstractElement<ConcreteElement>{};class SuperConcreteElement : public CRTPAbstractElement<SuperConcreteElement>{};int main(){ AbstractElement *e = new ConcreteElement(); e -> foo(); //Prints Concrete element}
通过添加中间CRTP类,我们可以将指向基类的指针强制转换为指向派生类的指针.从而解决了代码重复的问题.
总结以上是内存溢出为你收集整理的c – 将函数注入子类全部内容,希望文章能够帮你解决c – 将函数注入子类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)