Herança estrutural em C ++

170

Pode structser herdado em C ++?

Peter Mortensen
fonte

Respostas:

290

Sim, structé exatamente igual, classexceto que a acessibilidade padrão é publicpara struct(enquanto é privatepara class).

Alex Martelli
fonte
129

Sim. A herança é pública por padrão.

Sintaxe (exemplo):

struct A { };
struct B : A { };
struct C : B { };
Suvesh Pratapa
fonte
46

Além do que Alex e Evan já declararam, gostaria de acrescentar que uma estrutura C ++ não é como uma estrutura C.

No C ++, uma estrutura pode ter métodos, herança etc., assim como uma classe C ++.

Chad Gorshing
fonte
4
uma estrutura C ++ pode ser como uma estrutura C. Quando é, é chamado de POD - Plain Old Datatype. É uma distinção importante, pois, por exemplo, apenas estruturas POD podem fazer parte de sindicatos.
CAMH
9
Mas os PODs podem ter métodos, portanto, não são estruturas "tipo" C no sentido em que a cgorshing está falando.
Steve Jessop
Se é um POD, ele não possui métodos. Caso contrário, o nome não terá sentido.
RL-S
24

Claro. No C ++, estruturas e classes são quase idênticas (coisas como padronizar para público em vez de privado estão entre as pequenas diferenças).

Evan Teran
fonte
23

No C ++, a herança de uma estrutura é igual a uma classe, exceto as seguintes diferenças:

Ao derivar uma estrutura de uma classe / estrutura, o especificador de acesso padrão para uma classe / estrutura base é público. E ao derivar uma classe, o especificador de acesso padrão é privado.

Por exemplo, o programa 1 falha com um erro de compilação e o programa 2 funciona bem.

// 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;
}
Neha Agrawal
fonte