web-dev-qa-db-ja.com

C ++:構造体はクラスから継承できますか?

私が使用しているAPIの実装を見ています。

構造体がクラスから継承していることに気づき、それについて熟考するために一時停止しました...

最初に、構造体が別の構造体から継承できることを調べたC++マニュアルにはありませんでした。

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

そのような場合、構造体Bは構造体Aのすべてのデータを継承すると思います。構造体でパブリック/プライベートメンバーを宣言できますか?

しかし、私はこれに気付きました:

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

私のオンラインC++マニュアルから:

クラスはデータ構造の拡張された概念です。データのみを保持する代わりに、both data and functions。を保持できます。

クラスAにメンバー関数がある場合でも、上記の継承は有効ですか?構造体が関数を継承すると、関数はどうなりますか?そして、逆についてはどうですか?構造体から継承するクラス?

実際には、これがあります:

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

そして、私はこれをforeach message in user_messages.messages

メンバー関数を構造体に追加する場合、宣言を変更してクラスに「昇格」し、関数を追加し、以前のようにuser_messages.messagesを繰り返し処理できますか?

明らかに、私はまだ初心者であり、構造体とクラスが相互にどのように相互作用するのか、2つの実際的な違いは何なのか、継承ルールは何なのかまだわかりません...

62
augustin

はい、構造体はC++のクラスから継承できます。

C++では、classesとstructは、メンバーの継承とアクセスレベルに関するデフォルトの動作を除いて同じです。

C++クラス

  • デフォルトの継承= プライベート
  • メンバー変数と関数のデフォルトのアクセスレベル= プライベート

C++構造体

  • デフォルトの継承= public
  • メンバー変数と関数のデフォルトのアクセスレベル= public
105
Vite Falcon

C++で

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

以下と同等です:

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

そして

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

以下と同等です:

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

つまり、構造体/クラスのメンバー デフォルトでは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はクラスから継承できます。 classキーワードとstructキーワードの違いは、デフォルトのprivate/public指定子の変更です。

37
maxschlepzig

構造体とクラスの唯一の違いは、メンバーのデフォルトのアクセスレベルです(クラスにはプライベート、構造体にはパブリック)。これは、構造体がクラスから継承できることを意味し、逆も同様です。

ただし、通常、構造体とクラスの使用方法には違いがあり、標準では義務付けられていません。構造体は多くの場合、純粋なデータ(またはプロジェクトの好みに応じてポリモーフィズムのないオブジェクト)に使用され、クラスは他の場合に使用されます。これは単なる文体の違いであり、必須ではないことを強調します。

7

構造体はクラスと同じものですが、クラスはデフォルトでメンバーをプライベートに設定し、構造体はデフォルトでメンバーをパブリックに設定します。その結果、はい、2つの間で継承できます。 C++では、構造体からクラスを派生できます を参照してください。

5
MBennett

構造体とクラスはほとんど互換性があります-クラスのデフォルトがプライベート継承とメンバーに、構造体がパブリックにデフォルトが異なるだけです。クラスキーワード(および構造体ではない)を使用する必要があります。 「テンプレート<クラスT>」。

とはいえ、多くのプログラマーはこの2つを使用して、コードを読んでいるプログラマーにわずかな提案をします。構造体を使用することで、カプセル化を控えめに提案していますOO design。ライブラリの内部-すべての根幹をつかむのは公平なゲームですが、APIの変更がクライアントに不便を与え、抽象化が便利な境界でクラスが使用されます。この非常に緩い慣習はデフォルトのアクセシビリティの違いから発展しました-怠zy /効率的/簡潔(お好みに合わせて)プログラマーは、特に利点がない限り、最も簡単なことを行います。アクセス指定子を入力しないことは、可能な場合は良いことです。

4
Tony Delroy

はい。 Structはクラスから継承でき、その逆も可能です。アクセシビリティルールは

$ 11.2/2-「基本クラスのアクセス指定子がない場合、派生クラスがstructとして宣言されたときにpublicが想定され、クラスがclassとして宣言されたときにprivateが想定されます。」

編集2:クラスを次のように変更できます。通常、パブリックデータメンバーを持つことはbadのアイデアであることに注意してください。

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

はい、structはクラスから継承できます。 structclassは、C++で明示的に指定されていない場合、メンバーおよび基本クラス(または構造体)に想定されるアクセス指定子のみが異なります。構造体の場合、publicです。クラスの場合、privateです。

マニュアルから引用する文は、Cのデータ構造の概念と比較したC++のクラスの概念に関するものです。C++では、新しいキーワード-classが概念の変更をよりよく反映するために導入されました、ただしCのコードとの互換性のために、古いキーワードstructが残され、その意味は上記のとおりです。

4
Maciej Hehl

クラスは構造体からパブリックに継承しません。構造体は、クラスまたは構造体からパブリックに継承します。

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

B b; b.a = 5; //OK。はアクセス可能です

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

同じことを意味します。 B b; b.a = 5; //OK。はアクセス可能です

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

B b; b.a = 5; //よくない。にアクセスできません

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

B b; b.a = 5; //OK。はアクセス可能です

最後に:

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

B b; b.a = 5; //よくない。にアクセスできません

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

B b; b.a = 5; //よくない。にアクセスできません