在C ++中将父类引用作为参数传递给派生类

时间:2016-12-14 03:18:45

标签: c++ oop multiple-inheritance

我是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的公共代码,该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);

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

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

2 个答案:

答案 0 :(得分:2)

如果想法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功能。

希望可以提供帮助。

答案 1 :(得分:1)

只需将“公共代码”分解出去,然后将其制作成常见:

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