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

How can I implement internal abstract member classes in c++?

抽象 class 具有内部虚函数。 抽象 class 可以有内部虚拟 classes 稍后实现吗?

我尝试了以下方法:

#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; }

Child 是一个抽象 class,它将在派生的 classes 中被覆盖。我希望实现的 Child 可以用来定义一个函数。

但是,我得到一个错误:

invalid abstract return type for member function 'virtual C1::Child C1::getChild()'

我不能在派生的 class 中实现内部抽象 class,就像实现虚函数一样吗?

在当前代码中,class C1::Childclass C2::Child没有继承关系。因此它们是完全不相关的 classes。即使你将它们与继承联系起来,那么 getChild() 也不能 return Child (值)。它可以 return Child&(参考)或 Child*(指针)形成具有 协方差 的有效 virtual 方法。参考:C++ virtual function return type

使用 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 is a abstract class, which will be implemented later,"

virtual 方法一样,classes 没有这样的运行时关系。
"implementing later" 在 class 上下文中的最佳含义是——在封闭 class 的主体之外实现它,例如:

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

从您的 post 来看,您似乎混淆了一些事情。我建议您重新阅读摘要 classes 并自己尝试一些简单的示例。

Child is a abstract class, which will be implemented later, And I hope the implemented Child can be used to define a function.

纯虚拟方法(在您的示例中为 virtual int getint() = 0;)并不意味着要实现 "later"。它旨在通过派生的 class.

中的覆盖方法实现

例如如果你有

class Child {
   virtual int getint() = 0;
};

你做不到

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

也不

int Child::getint() { return 10; }

稍后。

您可以做的是:

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

理论上,Abstract Classes用于创建Interfaces。使用 Interfaces,客户需要所需的功能。通过 defining/implementing Interfaces,服务器完成客户端的功能。 Interface/Abstract Class 只是客户端和服务器之间 requirement/agreement 的蓝图。实现Interface/Abstract Class或满足功能需求的类可以被实例化。所以同一个 Interface/Abstract Class 可以有多个实现。现在,为了在不同的时间点无缝访问相同 Interface/Abstract Class 的所有这些不同实现,我们需要一种通用的方法。而这种广义的方式是通过 pointer(*) or reference(&) 到底层 Interface\Abstract Class.

在您的代码中 C1::Child 是一个 Abstract Class or Interface

所以,C1::getChild()可以return实现Interface/Abstract C1::Child。但是根据上述理论解释,它不能 return Interface/Abstract C1::Child 本身的实例。因此错误。 声明 C1::getChild() 的正确方法是:

  • virtual C1::Child* getChild() = 0;
  • virtual C1::Child& getChild() = 0;

此外,C1::Child可以简单地看作是namespace C1里面的class,因为class也是一种namespace,但有一些限制。