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()
       {...}
    }