在 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
如果 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
功能。
希望能帮到你。
我是 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
如果 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
功能。
希望能帮到你。