Рецоммендед, 2024

Избор Уредника

Разлика између преоптерећења и надјачавања функције у Ц ++

Полиморфизам је једна од кључних карактеристика ООП-а. То једноставно значи 'користити једно име за више форми'. Полиморфизам се може применити коришћењем 'преоптерећења функција', 'преоптерећења оператора' и 'виртуалне функције'. И 'преоптерећење' и 'превазилажење' подразумијевају појам полиморфизма. Овде, 'преоптерећење' је полиморфизам времена компајлирања и 'надјачавање' је полиморфизам времена извођења. Проучавање даље, ако говоримо о главној разлици у 'преоптерећењу' и 'превазилажењу'. У 'преоптерећењу' редефинишемо преоптерећене функције са истим именом функције, али различит број и тип параметара. У 'оверридинг' прототипу функције оверридден-а је иста у цијелом програму, али функцији коју треба прегазити претходи кључна ријеч 'виртуал' у основној класи и редефинирана је изведеном класом без било које кључне ријечи.

Даље, проучавамо разлику између преоптерећења и надјачавања уз помоћ табеле упоређивања.


Табела за упоређивање:

Основа за поређењеОверлоадингОверридинг
ПрототипеПрототип се разликује по томе што се број или тип параметра може разликовати.Сви аспекти прототипа морају бити исти.
Кључна речНиједна кључна реч није примењена током преоптерећења.Функцији која треба да буде надјачана претходи кључна реч 'виртуална' у основној класи.
Разликовни факторБрој или тип параметра се разликује, а који одређује да се позива функција.Коју функцију класе зове се показивач, одређује се адресом, којој је објекат класе додељен том показивачу.
Дефининг паттернФункција се редефинира са истим именом, али различитим бројем и типом параметра.Функција је дефинисана, којој претходи кључна реч 'виртуална' у главној класи и редефинише је изведена класа без кључне речи.
Време испуњењаВреме компајлирања.Време рада.
Конструктор / виртуална функцијаКонструктори могу бити преоптерећени.Виртуална функција може бити замењена.
Деструцтор
Деструктор не може бити преоптерећен.Деструктор може бити поништен.
БиндингПреоптерећење постиже рано везивање.Прекорачење се односи на касно везивање.

Дефиниција преоптерећења

Полиморфизам времена компајлирања назива се "преоптерећење". Како се преоптерећење генерише из концепта полиморфизма, оно обезбеђује „заједнички интерфејс за више метода“. То значи да, ако је функција преоптерећена, она садржи исто име функције док је редефинирано.

Преоптерећене функције се разликују у односу на, различити 'број или тип параметара', а једна преоптерећена функција се разликује од друге. На овај начин, компајлер препознаје која се преоптерећена функција зове. Најчешће преоптерећене функције су 'конструктори'. "Копирај конструктор" је врста "преоптерећења конструктора".

Имплементација преоптерећења у Ц ++

 цласс оверлоад {инт а, б; публиц: инт лоад (инт к) {// фирст лоад () фунцтион а = к; ретурн а; } инт лоад (инт к, инт и) {// друга функција лоад () а = к; б = и; ретурн а * б; }}; инт маин () {оверлоад О1; О1.лоад (20); // први лоад () функција позива О1.лоад (20, 40); // други функцијски позив () 

Овде је функција лоад () преоптерећења класе преоптерећена. Две преоптерећене функције класе могу се разликовати на начин да прва лоад () функција прихвата само један интегер параметар, док друга лоад () функција прихвата два целобројна параметра. Када објекат преоптерећења класе позове опцију лоад () са једним параметром, прво се позива функција лоад (). Када објекат позове опцију лоад () прелазећи два параметра, позива се друга функција лоад ().

Дефиниција надјачавања

Полиморфизам који је постигнут у току времена се назива 'превазилажење'. То се постиже коришћењем 'наслеђивања' и 'виртуалних функција'. Функцији коју треба прегазити претходи кључна реч 'виртуална' у основној класи и редефинише је у изведеној класи без било које кључне речи.

Једна од најважнијих ствари које треба запамтити у случају надјачавања је да се прототип функције оверридден не смије мијењати док га изведена класа редефинише. Када је задатој функцији додељен позив, Ц ++ одређује која се верзија функције назива на основу 'типа објекта који показује показивач' којим се обавља функција позива.

Имплементација надјачавања у Ц ++

 цласс басе {публиц: виртуал воид фунцт () {// виртуална функција базне класе цоут << "Ово је фунцт основне класе ()"; }}; класа изведена1: јавна база {јавна: воид фунцт () {// виртуална функција основне класе редефинисана у изведеној класи цоут << "Ово је функција изведене класе ()"; }}; цласс изведена2: публиц басе {публиц: воид фунцт () {// виртуална функција основне класе редефинисана у изведеном разреду цоут  фунцт (); // позива на изведену функцију класе (). * п = & д2; п-> фунцт (); // позив на функцију изведене класе (). ретурн 0; } 

Овде постоји једна основна класа која је јавно наслеђена од стране две изведене класе. Виртуелна функција је дефинисана у основној класи са кључном речју 'виртуална', и она је редефинисана од обе изведене класе без кључне речи. У маин (), основна класа креира показивачку варијаблу 'п' и објект 'б'; 'изведена' цреатес класа креира објекат д1 и изведена2 класа ствара објекат д2 '.

У почетку, адреса објекта основне класе 'б' је додељена показивачу основне класе 'п'. 'п' даје позив функцији фунцт (), тако да се позива функција основне класе. Онда је адреса изведеног објекта класе 'д1' додељена показивачу 'п', поново даје позив фунцт (); овде се извршава функција фунцт () изведене класе. Коначно, показивач 'п' је додељен објекту изведене класе. Онда 'п' позива функцију фунцт () која извршава функцију фунц () изведене2 класе.

Ако изведена класа1 / изведена2 није редефинисала фунцт (), тада би се позвао фунцт () основне класе, јер су виртуелне функције 'хијерархијске'.

Кључне разлике између преоптерећења и надјачавања

  1. Прототип функције која се преоптерећује разликује се због типа и броја параметра који се преносе функцији преоптерећења. С друге стране, прототип функције оверридден-а се не мијења, јер функција надјачавања обавља различите акције за различите класе којима припада, али с истим типом и бројем параметра.
  2. Преоптерећено име функције не претходи ниједној кључној речи, док, име функције надјачане претходи кључу "Виртуал" само у основној класи.
  3. Која функција преоптерећења је позвана зависи од типа или броја параметра који је прослеђен функцији. Прекорачена функција од које се класе позива овиси о томе која је објектна адреса класе додијељена показивачу, који је позвао функцију.
  4. Која преоптерећена функција треба да се позове решава се током компајлирања. Коју функцију поништавања која се позива је ријешено за вријеме извођења.
  5. Конструктори могу бити преоптерећени, али се не могу поништити.
  6. Деструктори не могу бити преоптерећени, али се могу поништити.
  7. Преоптерећење постиже рано везивање, јер ће се преоптерећена функција позвати рјешава током компајлирања. Преклапање постиже каснију везаност као што је функција која ће се позвати да се позове решава током рунтиме-а.

Сличности

  1. Оба се примењују на функције члана класе.
  2. Полиморфизам је основни концепт који стоји иза њих.
  3. Име функције остаје исто док ми примењујемо преоптерећење и надјачавање на функције.

Закључак

Преоптерећење и поништавање изгледа слично, али то није случај. Функције могу бити преоптерећене, али свака класа не може додатно редефинисати функцију преоптерећења у будућности. Виртуална функција не може бити преоптерећена; могу се само поништити.

Top