C++ 如何在c+;中实现内部抽象成员类+;?

C++ 如何在c+;中实现内部抽象成员类+;?,c++,abstract-class,internal-class,C++,Abstract Class,Internal Class,抽象类具有内部虚函数。 抽象类是否可以在以后实现内部虚拟类 我尝试了以下方法: #include <bits/stdc++.h> using namespace std; class C1 { public: class Child { int tmp; virtual int getint() = 0; }; virtual Child getChild() = 0; }; clas

抽象类具有内部虚函数。 抽象类是否可以在以后实现内部虚拟类

我尝试了以下方法:

#include <bits/stdc++.h>
using namespace std;

class C1 {
    public:
        class Child {
            int tmp;
            virtual int getint() = 0;
        };
    virtual Child getChild() = 0;
};

class C2: public C1 {
    public:
        class Child {
            int getint()
            {
                return 10;
            }
        } c;
    Child getChild()
    {
        return c;
    }
};

int main() { return 0; }
#包括
使用名称空间std;
C1类{
公众:
班童{
int tmp;
虚拟int getint()=0;
};
虚拟子getChild()=0;
};
C2类:公共C1类{
公众:
班童{
int getint()
{
返回10;
}
}c;
Child getChild()
{
返回c;
}
};
int main(){return 0;}
Child是一个抽象类,它将在派生类中被重写。我希望实现的可以用来定义函数

但是,我得到了一个错误:

成员函数“virtual C1::Child C1::getChild()”的抽象返回类型无效


我能否在派生类中实现内部抽象类,就像实现虚拟函数一样?

在当前代码中,
类C1::Child
类C2::Child
没有继承关系。因此,它们是完全不相关的类。即使您将它们与继承关联,也不能返回
Child
(值)。它可以返回
Child&
(参考)或
Child*
(指针),以形成具有协方差的有效
虚拟
方法。参考:

通过使用C++11中可用的
override
说明符,可以很容易地捕获此类错误

在不知道您要实现的目标的确切上下文的情况下,可能的代码应该如下所示:

class C1 {
  // ... same
  virtual Child& getChild() = 0;
  //      ^^^^^^ reference
};

class C2 : public C1 {
//         ^^^^^^ did you miss this?
public:
  class Child : public C1::Child {
  //                   ^^^^^^^^^ inheritance
    int getint() override { return 10; }
  } c;
  Child& getChild() override { return c; }
};

此外,您的以下陈述似乎令人困惑:

Child是一个抽象类,将在以后实现

virtual
方法一样,这些类没有这样的运行时关系。
在类的上下文中,“以后实现”的最佳含义是——在封闭类的主体之外实现它,例如:

class Outer { public: class Inner; };
// ...
class Outer::Inner { ... };

从你的帖子上看,你似乎把事情搞糊涂了。我建议你重读一下抽象类,自己尝试一些简单的例子

Child是一个抽象类,稍后将实现,我希望 实现的子级可用于定义函数

纯虚拟方法(
virtual int getint()=0;在您的示例中是
)并不意味着“以后”实现。它是由派生类中的重写方法实现的

如果你有

class Child {
   virtual int getint() = 0;
};
你不能这样做

class Child {
   virtual int getint() { return 10; }
};
也不是

后来

您可以做的是:

class Derived : public Child
{
   int getint() override { return 10; }
};

理论上,
抽象类
用于创建
接口
。使用
接口
,客户端需要所需的功能。通过定义/实现
接口
,服务器实现了客户端的功能<代码>接口/抽象类只是客户机和服务器之间需求/协议的蓝图。可以实例化实现
接口/抽象类
或满足功能需求的类。因此,可以有许多相同的
接口/抽象类的实现。现在,为了在不同的时间点无缝地访问同一
接口/抽象类的所有这些不同实现,我们需要一种通用的方法。这种通用方法是通过
指针(*)或对底层
接口\抽象类的引用(&)

在您的代码中,
C1::Child
是一个
抽象类或接口

因此,
C1::getChild()
可以返回接口/Abstract C1::Child
的实现。但根据上述理论解释,它不能返回
接口/抽象C1::Child
本身的实例。这就是错误。 声明
C1::getChild()
的正确方法是:

  • virtualC1::Child*getChild()=0
  • virtualc1::Child&getChild()=0

而且,
C1::Child
可以简单地看作
命名空间C1
中的
类,因为
也是一种
命名空间
,有一些限制。

这与内部类没有任何关系。你可以大大简化你的例子。下面是一个:
struct foo{virtual stuff()=0;};foo make_foo()。不能将抽象对象作为值返回。如果这样做,客户端如何使用它,因为
纯虚拟
函数缺少实现?。但是,您可以返回指向此类对象的指针。另外:在您的示例中,
Child
不是抽象的。编辑它,因为可能有人不理解您的问题。@MichałWalenciak客户端调用该抽象类中定义的虚拟函数。@ZehuiLin:我知道,但由于您返回了“complete”对象,它如何工作?:)在另一个类中定义的类与未定义的类之间的唯一区别是它们的名称的范围。你有两个不相关的类
C1::Child
C2::Child
。那么虚拟函数和抽象类的处理方式不同吗?我可以调用虚函数,但不能使用抽象类?@ZehuiLin,我不清楚你的确切Qn。但是,抽象类是在其主体中至少有一个纯
virtual
方法的类。使用基类引用或指针调用
virtual
方法。如果基类是抽象的,那么就不能有它的对象。如果你不清楚的话,我建议你举一些例子。有关抽象类的更多详细信息,请参阅:
class Derived : public Child
{
   int getint() override { return 10; }
};