Допустим, у нас есть шаблонный класс Area
, который имеет переменную-член T area
, а T getArea()
и void setArea(T)
функции-члены.
Я могу создать Area
объект определенного типа, набрав Area<int>
.
Теперь у меня есть класс Rectangle
, наследующий этот Area
класс. Поскольку Rectangle
сам по себе не является шаблоном, я не могу печатать Rectangle<int>
.
Как мне специализировать унаследованный Area
тип для Rectangle
объектов?
РЕДАКТИРОВАТЬ: Извините, я забыл уточнить - мои вопросы заключаются в том, можно ли наследовать Area без ее специализации, поэтому она не наследуется как Area of int, а как Area Rectangle может специализировать типы для.
c++
templates
inheritance
dtech
источник
источник
Ответы:
Для понимания шаблонов огромным преимуществом является четкое понимание терминологии, потому что то, как вы о них говорите, определяет способ о них думать.
В частности,
Area
это не шаблонный класс, а шаблон класса. То есть это шаблон, из которого могут быть созданы классы.Area<int>
является таким классом (это не объект, но, конечно, вы можете создать объект из этого класса так же, как вы можете создавать объекты из любого другого класса). Еще такой класс был быArea<char>
. Обратите внимание, что это совершенно разные классы, у которых нет ничего общего, кроме того факта, что они были созданы из одного и того же шаблона класса.Поскольку
Area
это не класс, вы не можете наследоватьRectangle
от него класс . Вы можете получить класс только из другого класса (или нескольких из них). ТакArea<int>
как это класс, вы можете, например, унаследоватьRectangle
от него:Поскольку
Area<int>
иArea<char>
являются разными классами, вы можете даже получить их одновременно (однако при доступе к их членам вам придется иметь дело с двусмысленностями):Однако при определении вы должны указать, какой класс наследовать
Rectangle
. Это верно независимо от того, созданы ли эти классы из шаблона или нет. Два объекта одного класса просто не могут иметь разные иерархии наследования.Что вы можете сделать, так это сделать
Rectangle
шаблон. Если вы напишетеУ вас есть шаблон,
Rectangle
из которого вы можете получить класс,Rectangle<int>
производный отArea<int>
, и другой класс,Rectangle<char>
производный отArea<char>
.Может случиться так, что вы захотите иметь один тип,
Rectangle
чтобы вы могли передавать все виды однойRectangle
и той же функции (которая сама не должна знать тип области). ПосколькуRectangle<T>
классы, созданные при создании экземпляра шаблонаRectangle
, формально независимы друг от друга, это не работает. Однако здесь вы можете использовать множественное наследование:Если важно, что ваш общий шаблон
Rectangle
является производным от универсального,Area
вы можете проделать тот же трюк и с нимArea
:источник
Вы просто пытаетесь извлечь из
Area<int>
? В этом случае вы делаете это:РЕДАКТИРОВАТЬ: после разъяснения кажется, что вы на самом деле тоже пытаетесь создать
Rectangle
шаблон, и в этом случае должно работать следующее:источник
источник
Сделайте Rectangle шаблоном и передайте имя типа в Area:
источник
Rectangle
должен быть шаблон, иначе это всего лишь один тип . Он не может быть не шаблоном, пока его основа волшебным образом такова. (Его основа может быть экземпляром шаблона , хотя вы, кажется, хотите сохранить функциональность базы как шаблона .)источник
источник