C++ 如何清理虚拟功能链中的功能参数?
我正试图让我的虚拟功能在最终用户看来更干净。虚拟函数存在的一个问题是,它们强制同一类型的保持链。然而,很多时候这是不可取的。因为它强制用户向上投射指针。所以我在Hello上想出了这个结构。您可以看到,这允许更改最终用户类中的类型。onHi是做这件事的传统方式。我想知道这种方法是否普遍使用,为什么C++ 如何清理虚拟功能链中的功能参数?,c++,C++,我正试图让我的虚拟功能在最终用户看来更干净。虚拟函数存在的一个问题是,它们强制同一类型的保持链。然而,很多时候这是不可取的。因为它强制用户向上投射指针。所以我在Hello上想出了这个结构。您可以看到,这允许更改最终用户类中的类型。onHi是做这件事的传统方式。我想知道这种方法是否普遍使用,为什么 struct base { virtual void onHello( base& X ) { x_printf( "Hello - setting base" ); } vir
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] );
}
永远不需要向上投射指针。什么是固定链?你做的东西叫什么。但在你的例子中,我认为这是一个糟糕的设计,因为它看起来像是你的班级在做别人的工作。尼古拉·孔德拉捷耶夫-谢谢你的评论,我发现它非常有用。这个类除了重定向之外没有做其他的工作,我的意思是你把base&传递给接口方法,所以你想用它做点什么,但是它是不同的对象,它应该自己处理。而且,向下投射指针也是个坏主意。我可能错了,也许你的例子太简单了,在更复杂的情况下,所有这些都是有意义的。但我的另一个猜测是,您需要这样的东西,看一看。在这个示例中,主函数只有指向基类的指针。这是典型的C++和主要的虚拟函数的海豚。如果您想拥有onHi提供的功能,大多数人都会编写与onHi相同的代码。然而,onHello提供了一种替代的、可能更干净的方法来处理与onHi相同的情况。因为onHello已经排除了指针转换,并且可能还排除了其他因素,比如参数断言。在安全方面,我可以说onHello更好,因为它减少了用户的代码。性能方面应该是一样的,谢谢。