我是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);
看起来像运行时多态,但不完全(或者是它?)......因为它在子类中......
这个设计本身就是垃圾,有更好的方法来实现这个目标吗?
答案 0 :(得分:2)
如果想法do
和doMore
同时出现在A
和B
中,那么这些是您希望调用的功能,那么您可以
使用像这样的模板函数:
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
并且不
定义了do
和doMore
函数,您将收到编译器错误(而不是运行时崩溃)。
如果您使用的是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