Eredità strutturale in C ++


Risposte:


290

Sì, structè esattamente come classtranne l'accessibilità di default è publicper struct(mentre è privateper class).


129

Sì. L'eredità è pubblica per impostazione predefinita.

Sintassi (esempio):

struct A { };
struct B : A { };
struct C : B { };

46

A parte ciò che Alex ed Evan hanno già affermato, vorrei aggiungere che una struttura C ++ non è come una struttura C.

In C ++, una struttura può avere metodi, ereditarietà, ecc. Proprio come una classe C ++.


4
una struttura C ++ può essere come una struttura C. Quando lo è, si chiama POD - Plain Old Datatype. È una distinzione importante, poiché ad esempio solo le strutture POD possono far parte dei sindacati.
Camh

9
Ma i POD possono avere metodi, quindi non sono "come" le strutture C nel senso di cui parla cgorshing.
Steve Jessop,

Se è un POD, non ha metodi. Altrimenti il ​​nome non ha senso.
RL-S,

24

Ovviamente. In C ++, le strutture e le classi sono quasi identiche (cose come il default su public anziché private sono tra le piccole differenze).


23

In C ++, l'eredità di una struttura è la stessa di una classe tranne le seguenti differenze:

Quando si ricava una struttura da una classe / struttura, l'identificatore di accesso predefinito per una classe / struttura di base è pubblico. E quando deriva una classe, l'identificatore di accesso predefinito è privato.

Ad esempio, il programma 1 ha esito negativo con un errore di compilazione e il programma 2 funziona correttamente.

// Program 1
#include <stdio.h>

class Base {
    public:
        int x;
};

class Derived : Base { }; // Is equivalent to class Derived : private Base {}

int main()
{
    Derived d;
    d.x = 20; // Compiler error because inheritance is private
    getchar();
    return 0;
}

// Program 2
#include <stdio.h>

struct Base {
    public:
        int x;
};

struct Derived : Base { }; // Is equivalent to struct Derived : public Base {}

int main()
{
    Derived d;
    d.x = 20; // Works fine because inheritance is public
    getchar();
    return 0;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.