C++ 在C+中声明抽象类型的变量+;
我想定义一个带有一些函数的通用类和带有虚拟函数的嵌套类:C++ 在C+中声明抽象类型的变量+;,c++,C++,我想定义一个带有一些函数的通用类和带有虚拟函数的嵌套类: 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中的函数:
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中的函数:
但是,我不能将变量'subfo'声明为抽象类型'c_foo::c_subfoo',因为c_foo::c_subfoo::do_subfo是一个纯虚拟函数
我如何定义c_foo::do_foo(),它对于所有派生类都是相同的,并且调用c_foo::c_subfoo函数,而不定义这些c_foo::c_subfoo函数,它们在每个派生类中都是不同的?为什么不使用?使
c_subfoo
成为一个派生自c_foo纯的类虚拟函数基本上说:您有来重写此函数。
重写意味着您必须从c_subfo派生并提供不同的实现。
这意味着您不能直接实例化c_subfo的对象
因此,这给您留下了不同的选择:
1.使用指向某个子对象的指针/引用,例如
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)
模板
c_foo类:公共子类
{
...
void do_foo()
{
...
subfo::do_subfo();
...
}
};
类别c_子对象:公共c_子对象
{
...
void do_subfo()
{...}
}
关于你的问题,作为旁注:
在这种情况下,类是否嵌套并不起任何作用。它只影响内部类的可见性/名称空间,而不影响其虚拟(或纯虚拟)行为。您不能创建抽象类的实例。(这是使类抽象的实际意图,以防意外实例化。)如果您打算对其进行实例处理-不要将其抽象化;-)您可以做的是:使用该抽象类的引用或指针,以便您可以将函数应用于任何派生类的实例。@Scheff将其抽象化的替代方法是什么?我应该在抽象类中为c_foo::c_subfoo::do_subfoo使用伪函数吗?您的问题是缺少一点上下文。(我怀疑是安)也许,再多描述一下你真正想要实现的目标。(可能的建议是:不要将其设置为类。不要将虚拟函数设置为纯函数。不要将其设置为虚拟函数,等等)
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)
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()
{...}
}