强制在所有基类中调用方法

丹拉

如何实现一种为所有基类递归调用另一种方法的方法?从概念上讲:

class C {
public:
    magical void recursiveWork() {
         thisClass::doWork();
         if (baseClassExists) {
              baseClass::recursiveWork();
         }
    }

    void doWork() {
        printf("bar");
    }
}

class D : public C {
public:
    void doWork() {
         printf("foo");
    }
}

D d;
d.recursiveWork(); // prints "foobar"
赫斯卡隆

您可以使用类似base_type下面的内容来指示基类,然后递归检查是否DoIt存在。(在这种情况下,如果base_type是最基本的类,我会检查是否与self不同)。当然,它不能用于多重继承(它应该具有识别所有base_type对象的功能),并且在基类上使用对象切片时要小心。

#include <iostream>
#include <utility>

class A1
{
public:
   using base_type = A1;
   virtual ~A1(){}
   virtual void DoIt(){ std::cout << "A1\n"; }
};

class A : public A1
{
public:
   using base_type = A1;
   virtual void DoIt(){
       std::cout << "A\n"; 
   }
};

class B : public A
{    
public:
    using base_type = A;
    virtual void DoIt(){
        std::cout << "B\n"; 
    }
};

template<class...> using void_t = void;

template<class, class = void>
struct has_do_it : std::false_type { constexpr static bool value = false; };

template<class T>
struct has_do_it<T, void_t<decltype(std::declval<T&>().DoIt())>> : std::true_type { constexpr static bool value = true; };

template<typename T>
void DoItRec(T t)
{
    if (has_do_it<T>::value) {
        t.DoIt();
        if(!std::is_same<T, typename T::base_type>::value)
        {
            typename T::base_type& base = t; // get base part (object slicing)
            DoItRec(base); 
        }
    }
}

int main()
{
    B b;
    DoItRec(b);
    return 0;
}

现场例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在所有基类上调用相同的方法

来自分类Dev

强制在所有继承类中实现方法

来自分类Dev

在所有继承的类上隐式调用方法

来自分类Dev

强制调用基类方法

来自分类Dev

强制调用基类方法

来自分类Dev

强制方法从基类调用基方法

来自分类Dev

如何在所有类中的所有测试之前运行方法?

来自分类Dev

C#中是否存在所有委托的基类

来自分类Dev

从具有多重继承的派生类中调用所有基类的通用命名方法

来自分类Dev

从具有多重继承的派生类中调用所有基类的通用命名方法

来自分类Dev

在Java中强制使用基类方法

来自分类Dev

如何在所有派生类中修改方法返回值?

来自分类Dev

强制Java中的类调用方法

来自分类Dev

以编程方式调用Java类中的所有方法

来自分类Dev

Trello API:在所有调用中获取无效令牌

来自分类Dev

在所有弹簧模型中插入类

来自分类Dev

如何强制RecyclerView.Adapter在所有元素上调用onBindViewHolder()

来自分类Dev

是不是必须强制在Child抽象类中实现所有接口方法,而必须强制在Grand Child类中实现所有接口方法?

来自分类Dev

如果测试方法驻留在所有测试通用的类中,如何记录测试类的名称?

来自分类Dev

是否有内置方法从Python所有基类中获取所有__annotations__?

来自分类Dev

有没有办法禁止派生类中的基类方法调用?

来自分类Dev

存根所有在类上调用的方法

来自分类Dev

调用所有并行类线程的方法

来自分类Dev

使所有类方法调用相同的函数

来自分类Dev

调用所有并行类线程的方法

来自分类Dev

使所有类方法调用相同的函数

来自分类Dev

FSharp在基类中调用通用方法

来自分类Dev

从Ada中的基类调用重写的方法

来自分类Dev

使GET变量在所有方法中均可用

Related 相关文章

  1. 1

    无法在所有基类上调用相同的方法

  2. 2

    强制在所有继承类中实现方法

  3. 3

    在所有继承的类上隐式调用方法

  4. 4

    强制调用基类方法

  5. 5

    强制调用基类方法

  6. 6

    强制方法从基类调用基方法

  7. 7

    如何在所有类中的所有测试之前运行方法?

  8. 8

    C#中是否存在所有委托的基类

  9. 9

    从具有多重继承的派生类中调用所有基类的通用命名方法

  10. 10

    从具有多重继承的派生类中调用所有基类的通用命名方法

  11. 11

    在Java中强制使用基类方法

  12. 12

    如何在所有派生类中修改方法返回值?

  13. 13

    强制Java中的类调用方法

  14. 14

    以编程方式调用Java类中的所有方法

  15. 15

    Trello API:在所有调用中获取无效令牌

  16. 16

    在所有弹簧模型中插入类

  17. 17

    如何强制RecyclerView.Adapter在所有元素上调用onBindViewHolder()

  18. 18

    是不是必须强制在Child抽象类中实现所有接口方法,而必须强制在Grand Child类中实现所有接口方法?

  19. 19

    如果测试方法驻留在所有测试通用的类中,如何记录测试类的名称?

  20. 20

    是否有内置方法从Python所有基类中获取所有__annotations__?

  21. 21

    有没有办法禁止派生类中的基类方法调用?

  22. 22

    存根所有在类上调用的方法

  23. 23

    调用所有并行类线程的方法

  24. 24

    使所有类方法调用相同的函数

  25. 25

    调用所有并行类线程的方法

  26. 26

    使所有类方法调用相同的函数

  27. 27

    FSharp在基类中调用通用方法

  28. 28

    从Ada中的基类调用重写的方法

  29. 29

    使GET变量在所有方法中均可用

热门标签

归档