我正在尝试让我的虚拟功能看起来更清洁,以供最终用户使用。虚函数的一个问题是它们在保持链中强制使用相同的类型。但是很多时候这是不可取的。因为它迫使用户向上指示。所以我想到了这个结构(onHello)。您可以看到允许更改最终用户类中的类型。 (onHi)是传统的做法。我想知道这种方法是否普遍使用,为什么或为什么不使用?
struct base
{
virtual void onHello( base& X ) { x_printf( "Hello - setting base" ); }
virtual void onHi ( base& X ) { x_printf( "Hi - setting base" ); }
};
template< typename T >
struct base_link : public base
{
virtual void onHello( base& X ) override { /*do type checking here*/ ((T*)this)->onHello( *(T*)&X ); }
};
struct bar_yes : public base_link<bar_yes>
{
bar_yes( int Y ) : Yes( Y ) {}
void onHello( bar_yes& Y ) { base::onHello( Y ); Yes = Y.Yes; }
virtual void onHi ( base& X ) override { /*do type checking here*/ base::onHi( X ); Yes = ((bar_yes*)&X)->Yes; }
int Yes;
};
struct bar_no : public base_link<bar_no>
{
bar_no ( int N ) : No( N ) {}
void onHello( bar_no& N ) { base::onHello( N ); No = N.No; }
virtual void onHi ( base& X ) override { /*do type checking here*/ base::onHi( X ); No = ((bar_no*)&X)->No; }
int No;
};
void main()
{
bar_yes TestYes[2] { 0, 1 };
bar_no TestNo[2] {100,200};
base* pBase[] { &TestYes[0], &TestNo[0] };
pBase[0]->onHello( TestYes[1] );
pBase[0]->onHi ( TestYes[1] );
pBase[1]->onHello( TestNo[1] );
pBase[1]->onHi ( TestNo[1] );
}