[英]How to make classes inherit each other?
我在单独的文件.h
和.cpp
中有两个类ClassOne
和ClassTwo
,如下所示:
// ClassOne.h file
#include <ClassTwo.h>
class ClassOne : public ClassTwo {
protected:
type m_string; // Required for "ClassTwo"
}
// ClassTwo.h file
#include <ClassOne.h>
class ClassTwo : public ClassOne {
public:
method1(); // <---|
method2(); // <- Required to be available in class ClassOne.
method3(); // <---|
}
正如您在前面的代码中看到的,两个类相互继承,但该代码出现错误error C2504: 'ClassOne': base class undefined
和error C2504: 'ClassTwo': base class undefined
。
这样做的目的是我希望“ClassTow”的成员函数在“ClassOne”中可用,但“ClassTwo”需要“ClassOne”中的成员变量。
如何让两个类相互继承?
也许 CRTP 会解决你的问题。 首先,创建 class ClassOne
作为模板,使用ClassTwo
类型作为参数。 此类型应为继承自 ClassOne 的ClassOne
:
template<typename ClassTwo>
class ClassOne
{
public:
void methodOne() {
if (you need to use methods of ClassTwo)
static_cast<ClassTwo*>(this)->methodTwo();
}
};
然后将ClassTwo
定义为继承ClassOne
指定模板参数的那个:
class ClassTwo : public ClassOne<ClassTwo>
{
public:
void methodTwo() {
if (you need to use methods of ClassOne)
methodOne();
}
};
更新:这是解决问题的艰难方法。 还有其他更简单的方法,例如使用虚拟方法:
class ClassOne
{
public:
void methodOne() {
if (you need to use methods of ClassTwo)
methodTwo();
}
virtual void methodTwo() = 0;
};
class ClassTwo : public ClassOne
{
public:
void methodTwo() override {
if (you need to use methods of ClassOne)
methodOne();
}
};
两种方法都有各自的优缺点。 我们需要详细了解您的任务,以建议哪个更好。
如何让类相互继承?
class 不可能继承它的孩子。 基数只能在 class 定义中指定,除非已指定,否则不能将 class 用作基数。 没有办法以这样的方式对这两个定义进行排序,以使两者都在彼此之前。 因此,这是不可能的。
这样的 inheritance 也将是自相矛盾的,因为 class object 包含作为子 ZA8CFDE6331BD4B62AC96F8911 的基础。 因此,你会以一内二内一内二内一内二内一内二内一内二内一内二内的情况结束……你能看到这是怎么回事吗? 它无处可去。 object 无限大,因为它包含无限深的 inheritance 层次结构。
用另一种方式表达这一点:Inheritance 层次结构可以看作是有向图。 inheritance 层次图不能包含循环。
这样做的目的是我希望“ClassTow”的成员函数在“ClassOne”中可用,但“ClassTwo”需要“ClassOne”中的成员变量。
您可以有两个类,它们都可以访问所有数据成员和如下函数:
struct ClassOne {
// all the member functions
// all the data members
};
struct ClassTwo : ClassOne {
// nothing here
};
现在您有两个类,它们都可以访问相同的数据成员和成员函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.