Katakanlah kita memiliki kelas template Area
, yang memiliki variabel anggota T area
, seorang T getArea()
dan void setArea(T)
fungsi anggota.
Saya dapat membuat Area
objek dengan tipe tertentu dengan mengetik Area<int>
.
Sekarang saya memiliki kelas Rectangle
yang mewarisi Area
kelas tersebut. Karena Rectangle
itu sendiri bukan template, saya tidak bisa mengetik Rectangle<int>
.
Bagaimana cara saya mengkhususkan Area
tipe yang diwariskan untuk Rectangle
objek?
EDIT: Maaf, saya lupa menjelaskan - pertanyaan saya adalah apakah mungkin mewarisi Area tanpa mengkhususkannya, jadi tidak diwariskan sebagai Area int tetapi karena Persegi Panjang Area dapat mengkhususkan tipe untuk.
c++
templates
inheritance
dtech
sumber
sumber
Jawaban:
Untuk memahami template, sangat bermanfaat untuk meluruskan terminologinya karena cara Anda membicarakannya menentukan cara memikirkannya.
Secara khusus,
Area
ini bukan kelas template, tapi template kelas. Artinya, ini adalah template tempat kelas dapat dibuat.Area<int>
adalah kelas seperti itu (ini bukan objek, tetapi tentu saja Anda dapat membuat objek dari kelas itu dengan cara yang sama seperti Anda membuat objek dari kelas lain). Kelas lain seperti ituArea<char>
. Perhatikan bahwa itu adalah kelas yang sama sekali berbeda, yang tidak memiliki kesamaan apa pun kecuali fakta bahwa mereka dihasilkan dari template kelas yang sama.Karena
Area
bukan kelas, Anda tidak dapat memperoleh kelasRectangle
darinya. Anda hanya dapat memperoleh satu kelas dari kelas lain (atau beberapa di antaranya). KarenaArea<int>
merupakan sebuah kelas, Anda dapat, misalnya, mengambilRectangle
darinya:Karena
Area<int>
danArea<char>
merupakan kelas yang berbeda, Anda bahkan dapat mengambil keduanya pada saat yang sama (namun saat mengakses anggota mereka, Anda harus berurusan dengan ambiguitas):Namun Anda harus menentukan kelas mana yang akan diturunkan saat Anda menentukan
Rectangle
. Ini benar tidak peduli apakah kelas-kelas itu dihasilkan dari template atau tidak. Dua objek dari kelas yang sama tidak dapat memiliki hierarki pewarisan yang berbeda.Yang bisa Anda lakukan adalah membuat
Rectangle
template juga. Jika Anda menulisAnda memiliki template
Rectangle
dari mana Anda bisa mendapatkan kelasRectangle<int>
asalArea<int>
, dan kelas lainRectangle<char>
asalArea<char>
.Mungkin Anda ingin memiliki satu tipe
Rectangle
sehingga Anda bisa meneruskan semua jenisRectangle
ke fungsi yang sama (yang tidak perlu mengetahui tipe Area). KarenaRectangle<T>
kelas yang dibuat dengan membuat contoh templateRectangle
secara formal tidak bergantung satu sama lain, cara kerjanya tidak seperti itu. Namun Anda dapat menggunakan beberapa warisan di sini:Jika penting bahwa generik Anda
Rectangle
diturunkan dari generik,Area
Anda juga dapat melakukan trik yang samaArea
:sumber
Apakah Anda hanya mencoba untuk mendapatkan dari
Area<int>
? Dalam hal ini Anda melakukan ini:EDIT: Setelah klarifikasi, tampaknya Anda benar-benar mencoba membuat
Rectangle
template juga, dalam hal ini yang berikut ini akan berfungsi:sumber
sumber
Jadikan Rectangle sebagai template dan berikan nama jenis ke Area:
sumber
Rectangle
harus berupa template, jika tidak maka hanya satu jenis . Itu tidak bisa menjadi non-template sementara basisnya secara ajaib. (Basisnya mungkin merupakan contoh templat , meskipun Anda tampaknya ingin mempertahankan fungsionalitas basis sebagai templat .)sumber
sumber