我想用一些函数定义一个通用类,并用虚函数定义一个嵌套类:
class c_foo {
public:
class c_subfoo {
public:
virtual int do_subfoo(void) = 0;
};
int do_foo(void);
};
函数c_foo :: do_foo()会调用嵌套类c_foo :: c_subfoo中的函数:
int c_foo::do_foo(void) {
c_subfoo subfoo;
subfoo.do_subfoo();
return 0;
};
但是我不能将变量'subfoo'声明为抽象类型'c_foo :: c_subfoo',因为c_foo :: c_subfoo :: do_subfoo是一个纯虚函数。
如何定义c_foo :: do_foo()(对于所有派生类始终是相同的,并且调用c_foo :: c_subfoo函数),而又不定义这些c_foo :: c_subfoo函数(在每个派生类中都不同)则如何?
纯虚函数基本上说:您必须重写此函数。并且重写意味着您必须派生自c_subfoo并提供不同的实现。这意味着您不能直接实例化c_subfoo的对象。
因此,这为您提供了不同的选择:
1.使用指针/对某些subsubfoo的引用,例如
c_subfoo* subfoo = somefactory::create_some_sub_subfoo();
subfoo->do_subfoo(); // now use virtual dispatch
(of course, you would rather use smart pointers instead of raw pointers)
要么
要么
要么
4.也许您可以使用静态多态性(如CRTP )
template <typename SubFoo>
class c_foo : public SubFoo
{
...
void do_foo()
{
...
SubFoo::do_subfoo();
...
}
};
class c_subfoo : public c_foo<c_subfoo>
{
...
void do_subfoo()
{...}
}
作为有关您的问题的旁注:
在这种情况下,是否嵌套一个类不起作用。它只会影响内部类的可见性/命名空间,而不会影响其虚拟(或纯虚拟)行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句