Ketika anggota statis diwariskan, apakah mereka statis untuk seluruh hierarki, atau hanya kelas itu, yaitu:
class SomeClass
{
public:
SomeClass(){total++;}
static int total;
};
class SomeDerivedClass: public SomeClass
{
public:
SomeDerivedClass(){total++;}
};
int main()
{
SomeClass A;
SomeClass B;
SomeDerivedClass C;
return 0;
}
akan total menjadi 3 dalam ketiga contoh, atau apakah itu 2 untuk SomeClass
dan 1 untuk SomeDerivedClass
?
sumber
static int total
berbeda untuk setiap kelas turunan satu-satunya cara untuk mencapainya dengan menambahkanstatic int total
ke setiap kelas? Atau mungkinkah hanya menggunakan definisi kelas dasar (?), Karena variabeltotal
harus menjadi properti setiap kelas. Di sisi lain seharusnya begitustatic
.Jawabannya sebenarnya adalah empat dalam semua kasus, karena pembangunan
SomeDerivedClass
akan menyebabkan total bertambah dua kali .Berikut adalah program lengkap (yang saya gunakan untuk memverifikasi jawaban saya):
Dan hasilnya:
sumber
Ini adalah 4 karena ketika objek turunan dibuat, konstruktor kelas turunan memanggil konstruktor kelas dasar.
Jadi nilai variabel statis bertambah dua kali.
sumber
Itu akan:
sumber
Konstruktor SomeClass () dipanggil secara otomatis ketika SomeDerivedClass () dipanggil, ini adalah aturan C ++. Itulah mengapa total bertambah satu kali per setiap objek SomeClass, lalu dua kali untuk objek SomeDerivedClass. 2x1 + 2 = 4
sumber
3 dalam ketiga contoh.
Dan untuk pertanyaan Anda yang lain, sepertinya Anda benar-benar hanya membutuhkan variabel const, bukan statis. Mungkin lebih jelas untuk menyediakan fungsi virtual yang mengembalikan variabel yang Anda butuhkan yang diganti dalam kelas turunan.
Kecuali kode ini dipanggil di jalur kritis di mana kinerja diperlukan, selalu pilih kode yang lebih intuitif.
sumber
Ya, kelas turunan akan berisi variabel statis yang sama, yaitu - semuanya akan berisi total 3 (dengan asumsi bahwa total diinisialisasi ke 0 di suatu tempat).
sumber