如何在 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::Child
和class 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
,但有一些限制。
抽象 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::Child
和class 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
,但有一些限制。