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

Pass parent class reference as argument in derived class in C++

我是 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 的通用代码 class?

类似

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);

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

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

只需分解出 "common code",并使其成为通用的:

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
    }
}

这是最简单直接的方法。另一种替代方法更接近于您的 "pass me a pointer of some kind" 预期方法:

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

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

希望能帮到你。