而不是
我正在尝试为遗留继承层次结构创建一个包装器类,它不是严格多态的。在包装类中,我为一些方法添加了额外的功能,但对于许多其他方法,我只想调用包装类方法
而不是
wrapper->operator()([](Derived& x)
{
x.print();
});
或
wrapper->operator->()->print();
有什么方法可以给我吗
wrapper->print();
提前感谢您的回答。。
您的问题是实际使用指针。
目前,不是
wrapper->operator->()->print();
你可以写
(*wrapper)->print();
如果替换不需要的指针
wrap<Derived> *wrapper = new wrap<Derived>(der);
通过
wrap<Derived> wrapper(der);
然后,您可以更换
wrapper->operator->()->print();
通过
wrapper->print();
// or wrapper.operator->()->print(); :)
以相同的方式
wrapper->operator()([](Derived& x)
{
x.print();
});
将成为
wrapper(([](Derived& x)
{
x.print();
});
并没有给你想要的结果,但仍然相对便宜(从需要编写的代码的意义上来说(:继承:
class Wrapped
{
public:
void f();
void g();
};
class Wrapper : private Wrapped
{
public:
// replacing Wrapped's f with own variant:
void f() { pre(); Wrapped::f(); post(); };
// pulling Wrapped's g into public domain again:
using Wrapped::g;
};
因此,您所要做的就是添加相应的using
声明。如果你现在问:"为什么不公开继承,那么我不必继承?">,那么考虑以下内容:
Wrapped* w = new Wrapper();
w->f(); //Wrapped's version of f will be called, as f in given example is not virtual!
也许你会说"我永远不会直接使用Wrapped
。">。这是可行的,但仍然在某个地方使用它,然后出现错误的危险仍然存在于公共继承中。。。