【问题标题】:Pass parent class reference as argument in derived class in C++将父类引用作为 C++ 派生类中的参数传递
【发布时间】:2016-12-14 03:18:44
【问题描述】:

我是 C++ 新手,正在尝试实现以下设计。

class A { do (); doMore (); } // abstract
class B { do (); doMore (); } // abstract

class X : public A, public B // Also abstract
{        
    foo() {
        // common code
        A::do();
        A::doMore();
    }
    bar() {
        // common code
        B::do();
        B::doMore();
    }
}

A 和 B 都提供了 do()doMore() 的实现。 如何提取新函数采用调用正确父类中的方法的 arg 的公共代码?

类似

X::newMethod(arg_that_indicates_parent_class) {
    // common code
    arg_that_indicates_parent_class::do();
    arg_that_indicates_parent_class::doMore();
}

那就这样称呼吧

newMethod(pass_A_somehow);
newMethod(pass_B_somehow);

看起来像运行时多态性,但不完全是(或者是吗?)...因为它在子类中...

这个设计本身就是垃圾吗?有更好的方法来实现吗?

【问题讨论】:

    标签: c++ oop multiple-inheritance


    【解决方案1】:

    如果想法是 dodoMore 将同时出现在 AB 中,并且这些是您特别希望调用的函数,您可以 使用这样的模板函数:

    class X : public A, public B // Also abstract
    {        
        template <typename T>
        void newMethod()
        {
            T::do();
            T::doMore();
        }
    }
    

    然后显式使用它,然后你可以这样做:

    X x;
    x.newMethod<A>();
    x.newMethod<B>();
    

    这具有在编译时捕获一些错误的额外好处,也就是说,如果您尝试传递 C 而它没有 dodoMore 函数定义后,您将收到编译器错误(而不是运行时崩溃)。

    如果您使用 C++1x,这也可以让您利用 std::enable_if 功能。

    希望能有所帮助。

    【讨论】:

      【解决方案2】:

      只需分解出“通用代码”,然后让它变得通用:

      class X : public A, public B // Also abstract
      {        
          void foo() {
              commoncode();
              A::do();
              A::doMore();
          }
          void bar() {
              commoncode();
              B::do();
              B::doMore();
          }
      
          void commoncode()
          {
               // Your common code
          }
      }
      

      这是最简单直接的方法。另一种替代方法更接近您的“向我传递某种指针”的预期方法:

      class X : public A, public B // Also abstract
      {        
          void call_a()
              A::do();
              A::doMore();
          }
          void call_b()
              B::do();
              B::doMore();
          }
      
          void commoncode( void (X::*ptr)() )
          {
               // Your common code
      
               (this->*ptr)();
          }
      }
      

      commoncode() 的参数是

      &X::call_a
      

      &X::call_b
      

      【讨论】:

      • common code() 可能不是最好的表达方式。为了简洁起见,我只是把它写成这样。公共代码实际上围绕着对do()doMore() 的调用。你的第二个建议看起来很有希望。我试试看!
      猜你喜欢
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多