在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中的函数

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函数(在每个派生类中都不同)则如何?

StPiere

虚函数基本上说:您必须重写此函数。并且重写意味着您必须派生自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)

要么

  1. 不要使用虚拟

要么

  1. 也许您可以将这些函数设为静态,如果它们不需要对象来进行操作

要么

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++抽象类型声明

来自分类Dev

不要知道如何从在C#中声明为抽象类类型的对象中检索属性

来自分类Dev

如何在C ++中声明抽象类

来自分类Dev

如何在C ++中声明抽象类的向量列表?

来自分类Dev

C#声明类型定义无法创建抽象类或接口的实例

来自分类Dev

是否可以在C ++ / CLR中实现用C#声明的抽象类?

来自分类Dev

具有返回不同类型子项的抽象类中的C#抽象方法

来自分类Dev

抽象类作为类型,派生类作为实例在C ++中

来自分类Dev

制作一个地图,其中值类型是C ++中的抽象类

来自分类Dev

在C#中为抽象类的子类型实现重载方法

来自分类Dev

制作一个地图,其中值类型是C ++中的抽象类

来自分类Dev

C# - 通过反射从抽象类中的类变量调用函数

来自分类Dev

以抽象类为声明的基于范围的 for 循环 C++

来自分类Dev

C ++中抽象类的函数定义

来自分类Dev

抽象类中的c ++克隆函数

来自分类Dev

C ++中抽象类(接口)的数组

来自分类Dev

抽象类的函数定义中的C ++

来自分类Dev

C ++中的抽象类意味着抽象吗?

来自分类Dev

调用抽象类类型C#的子实现

来自分类Dev

如何在抽象类中声明List变量

来自分类Dev

在C中声明外部变量的不同类型

来自分类Dev

Scala 中的抽象类型、变量和类型类

来自分类Dev

抽象类C ++

来自分类Dev

C ++:抽象类

来自分类Dev

C ++中抽象类中的运算符<<

来自分类Dev

在C / C ++中声明变量

来自分类Dev

错误:无法声明变量[变量名称]为抽象类型[子类]

来自分类Dev

从C ++中的.NET抽象类派生,System :: IO :: TextWriter

来自分类Dev

“深度C#”中的抽象类实例化