簡體   English   中英

C ++:結構可以從類繼承嗎?

[英]C++: Can a struct inherit from a class?

我正在查看我正在使用的API的實現。

我注意到一個結構繼承自一個類,我暫停思考它...

首先,我沒有在我研究過的C ++手冊中看到結構可以從另一個結構繼承:

struct A {};
struct B : public A {};

我想在這種情況下,struct B繼承了結構A中的所有數據。我們可以在結構中聲明公共/私有成員嗎?

但我注意到了這一點:

 class A {};
 struct B : public A {};  

從我的在線C ++手冊:

類是數據結構的擴展概念:它不是僅保存數據,而是包含數據和函數。

即使A類有一些成員函數,上述繼承是否有效? 結構繼承它們時,函數會發生什么? 那反面呢:一個繼承自結構的類?

實際上,我有這個:

struct user_messages {
  std::list<std::string> messages;
};

我曾經像foreach message in user_messages.messages一樣迭代它。

如果我想在我的結構中添加成員函數,我是否可以更改其聲明並將其“提升”到類,添加函數,並像我之前一樣迭代我的user_messages.messages?

顯然,我仍然是一個新手,我仍然不清楚結構和類如何相互作用,兩者之間的實際區別是什么,以及繼承規則是什么......

是的,struct可以繼承C ++中的類。

在C ++中, 類和結構是相同的,除了它們關於成員的繼承和訪問級別的默認行為

C ++類

  • 默認繼承= 私有
  • 成員變量和函數的默認訪問級別= 私有

C ++結構

  • 默認繼承= public
  • 成員變量和函數的默認訪問級別= public

在C ++中

struct A { /* some fields/methods ... */ };

相當於:

class A { public: /* some fields/methods ... */ };

class A { /* some fields/methods ... */ };

相當於:

struct A { private: /* some fields/methods ... */ };

這意味着struct / class的成員默認為public / private

使用struct還會將默認繼承更改public ,即

struct A { }; // or: class A { };
class B : A { };

相當於

struct A { }; // or: class  A { };
struct B : private A { };

反過來說,這個

struct A { }; // or: class A { };
struct B : A { };

相當於:

struct A { }; // or: class A { };
class B : public A { };

簡介:是的, struct可以從類繼承。 classstruct關鍵字之間的區別只是默認私有/公共說明符的更改。

結構和類之間的唯一區別是成員的默認訪問級別(類為private,結構為public)。 這意味着結構應該能夠從類繼承,反之亦然。

但是,標准沒有規定的結構和類的使用方式通常有所不同。 結構通常用於純數據(或根據您的項目首選項沒有多態的對象),並且類用於其他情況。 我強調這只是一種風格差異而不是必需的。

要理解的主要是結構來自C,而類是C ++。 這意味着雖然結構是一流的面向對象的公民,但它們也有遺留的目的,這就是類被分離並且結構被默認訪問公共的原因。 然而,一旦完成,它們絕對完全相同,並且在各方面都可以互換。

結構與類相同,只是類默認其成員為private,而struct默認其成員為public。 結果,是的,你可以在兩者之間繼承。 請參閱C ++,我可以從結構中派生一個類

struct和class幾乎可以互換 - 只是使用不同的默認值,類默認為私有繼承,成員,結構為public。 必須使用class關鍵字(而不是struct)。 “template <class T>”。

也就是說,許多程序員使用這兩個程序員給程序員讀取代碼提出了一個小小的建議:通過使用一個結構,你巧妙地建議一個更少封裝的OO設計。 一個結構可能在庫內部使用 - 其中所有內容都是公平的游戲,而類在API的改變會給客戶帶來不便並且更好的抽象是有用的邊界上使用。 這種非常松散的約定已經超出了默認可訪問性的差異 - 懶惰/高效/簡潔(隨你選擇)程序員做最簡單的事情,除非有其他好處,並且在可能的情況下不輸入訪問說明符是很好的。

是。 Struct可以從類繼承,反之亦然。 可訪問性規則是

$ 11.2 / 2-“在沒有基類的訪問說明符的情況下,當派生類被聲明為struct時假定為public,並且當類被聲明為class時假定為private。”

編輯2:所以你可以改變你的課程: 請注意,通常使用公共數據成員是一個主意。

class user_messages {  // i also changed the name when OP was modified :)
public:   
   std::list<std::string> messages;  
};

是的, struct可以從類繼承。 structclass僅在為成員和基類(或結構)假定的訪問說明符方面有所不同,如果沒有在C ++中明確指定的話。 結構是public 對於課程,它是private

您在本手冊中引用的句子是關於C ++中類的概念,與C中的數據結構的概念相比較。在C ++中引入了新的關鍵字 - class以更好地反映概念的變化,但是為了兼容在C中的代碼中,留下了一個舊的關鍵字struct ,它的含義如上所述。

類不會公開繼承結構。 結構將公開繼承自類或結構。

class A
{
public:
    int a;
};
struct B : A
{};

B b; BA = 5; //好。 a是可訪問的

class A
{
public:
    int a;
};
struct B : public A
{};

它意味着相同。 B b; BA = 5; //好。 a是可訪問的

struct A
{int a;};
class B : A
{};

B b; BA = 5; //不好。 a無法訪問

struct A
{int a;};
class B : public A
{};

B b; BA = 5; //好。 a是可訪問的

最后:

class A
{int a;};
class B : A
{};

B b; BA = 5; //不好。 a無法訪問

class A
{int a;};
class B : public A
{};

B b; BA = 5; //不好。 a無法訪問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM