C ++ 'da yapısal kalıtım


Yanıtlar:


292

Evet, structaynen gibidir classvarsayılan erişilebilirlik olduğunu haricinde publiciçin struct(öyle ise privateiçin class).


129

Evet. Devralma varsayılan olarak herkese açıktır.

Sözdizimi (örnek):

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

47

Alex ve Evan'ın daha önce belirttikleri dışında, bir C ++ yapısının bir C yapısı gibi olmadığını eklemek isterim.

C ++ 'da, bir yapı tıpkı bir C ++ sınıfı gibi yöntemlere, mirasa vb. Sahip olabilir.


4
bir C ++ yapısı bir C yapısı gibi olabilir. Bu olduğunda, buna POD - Düz Eski Veri Türü denir. Bu önemli bir ayrımdır, çünkü örneğin yalnızca POD yapıları sendikaların bir parçası olabilir.
camh

9
Ancak POD'ların yöntemleri olabilir, bu yüzden cgorshing'in bahsettiği anlamda C yapıları "gibi" değildir.
Steve Jessop

Eğer bir POD ise, yöntemleri yoktur. Aksi takdirde isim anlamsızdır.
RL-S

24

Elbette. C ++ 'da, yapılar ve sınıflar neredeyse aynıdır (özel yerine halka açık varsayılan şeyler küçük farklar arasındadır).


24

C ++ 'da, bir yapının mirası aşağıdaki farklar dışında bir sınıfla aynıdır:

Bir yapı / sınıftan türetilirken, temel sınıf / yapı için varsayılan erişim belirteci herkese açıktır. Ve bir sınıf türetirken, varsayılan erişim belirteci özeldir.

Örneğin, program 1 bir derleme hatasıyla başarısız olur ve program 2 düzgün çalışır.

// 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.