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

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

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

我尝试了以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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; }

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

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

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

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


在本法中,class C1::Childclass C2::Child没有继承关系。因此它们是完全无关的类。即使你把它们和继承联系起来,那么getChild()也不能返回Child的价值。它可以返回Child&(引用)或Child*(指针),以形成一个具有协方差的有效virtual方法。参考:C++虚拟函数返回类型

这样的错误很容易通过使用在C++ 11中可用的EDCOX1×7说明符来捕获。

在不知道您试图实现什么的确切上下文的情况下,可能的代码应该如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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方法一样,类也没有这样的运行时关系。在类的上下文中,"稍后实现"的最佳含义是——在封闭类的主体之外实现它,例如:

1
2
3
class Outer { public: class Inner; };
// ...
class Outer::Inner { ... };


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

在您的代码中,C1::Child是anAbstract Class or Interface

因此,C1::getChild()可以返回Interface/Abstract C1::Child的实现。但根据上述理论解释,它不能返回Interface/Abstract C1::Child本身的实例。这就是错误。申报C1::getChild()的正确方式是:

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

另外,由于class也是一种有一定限制的namespace,所以C1::Child可以简单地看作namespace C1内部的class


从你的职位上看,你似乎很困惑。我建议你重新阅读抽象类,并自己尝试一些简单的例子。

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;并不打算"稍后"实现。它应该由派生类中的重写方法实现。

例如,如果你有

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

你做不到

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

也不

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

稍后。

你能做的是:

1
2
3
4
class Derived : public Child
{
   int getint() override { return 10; }
};