【问题标题】:avoid specifying functions to call in diamond design避免指定在菱形设计中调用的函数
【发布时间】:2013-11-15 22:42:58
【问题描述】:

我目前有一个钻石设计,看到一个相关问题here

在那个问题中,我假设B类和C类是从A类虚继承的,所以在D类中,当我们需要调用虚函数时,我们需要指定调用哪个虚函数。

D::foo()
{
  B::foo(); //specify foo() in B
}

对于我的钻石设计,我有很多虚函数要重写,以便让这些函数被正确的 B 或 C 父类函数调用。

不好,需要做很多重复的工作,当我有子类时,你有没有更好的解决方案,以便我可以在D类中调用B的foo()但不重写示例以上。

【问题讨论】:

    标签: c++ diamond-problem


    【解决方案1】:

    从 C++11 开始,你可以做一个别名:

    class A
    {
        public:
            virtual void foo() { cout << "A" << endl; }
    }
    
    
    class B : public virtual A
    {
        public:
            void foo() { cout << "B" << endl; }
    }
    
    
    class C : public virtual A
    {
        public:
            void foo() { cout << "C" << endl; }
    }
    
    class D : public B, C
    {
        using B::foo;
    }
    

    这样,做:

    D obj;
    obj.foo();
    

    将输出B;

    【讨论】:

      【解决方案2】:

      我认为模板类在这里可以解决问题。

      http://www.cplusplus.com/doc/tutorial/templates/

      【讨论】:

      • 这里应该有什么帮助?
      • 再一次,再次阅读问题似乎我认为你试图解决你有许多继承类的问题,D1,D2等,有些使用A,有些使用B。或者A和黑方对他们每个人都有不同的指定角色。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多