[英]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.