C++ виртуален конструктор

C Virtualen Konstruktor



C++ не ни улеснява при конструирането на виртуални конструктори, тъй като не е възможно да заменим конструктора на класа. Така че виртуализацията на конструктора е безсмислена. Няма концепция за създаване на виртуален конструктор в C++ програма, но можем да създадем виртуален деструктор там. Можем също да го дефинираме, тъй като програмирането на конструктор в C++ не може да се счита за виртуално, защото когато се извика конструктор на клас, паметта не съдържа виртуална таблица, което показва, че не е създаден виртуален указател. Следователно конструкторът трябва да бъде невиртуален през цялото време.

Въпреки това може да съществува виртуален деструктор. Тук ще покажем какво се случва, когато създадем виртуален конструктор в C++, както и работата на виртуалния деструктор вместо виртуалния конструктор.

Пример 1:

Нека създадем виртуалния конструктор и да започнем нашия код, като поставим заглавния файл „iostream“. Този заглавен файл е за функциите, които са декларирани в него като „cin“ и „cout“. След това добавяме пространството от имена „std“, така че не можем да добавим това „std“ с всяка функция в нашия код. След това създаваме клас, който е базовият клас на нашия код с името „my_base“ и след това добавяме „public“, за да създадем виртуалния конструктор.







Виртуалният конструктор се създава тук чрез поставяне на ключовата дума „virtual“. Вътре в този виртуален конструктор поставяме оператор „cout“. Под това създаваме функция, наречена “show”, в която отново използваме “cout”. След това създаваме производен клас на този базов клас с името „my_derived“ и след това установяваме конструктора „my_derived()“ в полето „public“. Вмъкваме оператор „cout“ в този конструктор „my_derived()“. Под него конструираме функция, наречена 'show', където използваме 'cout' още веднъж.



Сега, след извикване на “main()”, ние създаваме указател на базовия клас с името “my_ptr” и също създаваме обекта на производния клас, който е “Obj_d”. След това присвояваме адреса на „Obj_d“ на „my_ptr“. След това извикваме функцията “show()” чрез “my_ptr”.



Код 1:





#include
използвайки пространство от имена std ;
клас моята_база
{
публичен :
виртуален моята_база ( )
{
cout << „Ето моят базов клас“ << endl ;
}
невалиден шоу ( )
{
cout << 'покажи функцията на базов клас' << endl ;
}
} ;
клас my_derived : публичен моята_база
{
публичен :
my_derived ( )
{
cout << „Ето моят производен клас“ << endl ;
}
невалиден шоу ( )
{
cout << 'покажи функцията на производен клас' < шоу ( ) ;
}

Изход:
Тук се показва съобщение за грешка, което казва, че конструкторът не може да бъде обявен за виртуален в програмирането на C++. И така, можем да видим, че C++ не ни позволява да генерираме виртуалния конструктор, но можем да създадем виртуалния деструктор.



Пример 2:

Нека разрешим предишния проблем и създадем виртуалния деструктор в този код. След като декларираме класа „new_base“, поставяме „публичния“ конструктор, в който създаваме виртуалния деструктор, като добавяме „virtual ~“ с „new_base“. Вмъкваме оператор 'cout' в този виртуален деструктор. Под него конструираме функция, наречена “show”, която използва “cout”. След това създаваме производен клас, който е „new_derived“ от този базов клас „new_base“ и конструираме деструктора „new_derived()“ в полето „public“. Този деструктор „new_derived()“ вече има добавен оператор „cout“.

Под него създаваме функция, наречена “show”, която отново използва израза “cout”. След като извикаме функцията „main()“, сега създаваме обект от производния клас „obj_d“, както и указател на базовия клас, наречен „ptr1“. След това даваме адреса „obj_d“ на „ptr1“. След това методът “show()” се извиква с помощта на “ptr1”.

Код 2:

#include
използвайки пространство от имена std ;
клас нова_база
{
публичен :
виртуален ~нова_база ( )
{
cout << „Деструкторът на базовия клас е тук“ << endl ;
}
невалиден шоу ( )
{
cout << „Показващата функция на базовия клас“ << endl ;
}
} ;
клас ново_изведено : публичен нова_база
{
публичен :
~ново_изведено ( )
{
cout << „Деструкторът на производния клас е тук“ << endl ;
}
невалиден шоу ( )
{
cout << „Показващата функция на базовия клас“ < шоу ( ) ;
}

Изход:
Тази програма използва указателен обект на „new_base“, който сочи към производния клас „obj_d“. По този начин първо извиква метода “show()” на класа “new_base”. След това извиква метода “~new_derived()” на класа “new_derived” и показва “~new_base” на базовия клас.

Пример 3:

Ето още един код за генериране на „виртуалния“ конструктор. След като включим пространството от имена „iostream“ и „std“, генерираме клас „B“. Под това създаваме „публичния“ конструктор, който е „B()“ и след това генерираме „cout“. Функциите конструктор и деструктор се дефинират чрез използване на 'публичен' спецификатор за достъп, в който всеки обект в класа може да извика.

Сега също създаваме деструктора „~B()“ на този базов клас, в който отново използваме „cout“. След това създаваме клас „D“, който е производният клас на базовия клас „B“ и поставяме „public“ тук. Вътре в тази „общественост“ ние създаваме конструктора, както и деструктора на производния клас с имена „D()“ и „~D“, съответно. И двете съдържат „cout“ вътре в тях. Сега имаме функцията 'main()'. След като извикаме тази функция, генерираме указателния обект на базовия клас.

След това използваме ключовата дума „delete“ и поставяме „base_ptr“ тук. В този случай пространството на деструктора се изтрива чрез извикване на указателния обект на базовия клас.

Код 3:

#include
използвайки пространство от имена std ;
клас б
{
публичен :
б ( )
{
cout << 'Конструктор на базовия клас' << endl ;
}
( )
{
cout << 'Деструктор на базовия клас' << endl ;
}
} ;

клас д : публичен б
{
публичен :
д ( )
{
cout << „Конструктор на производния клас“ << endl ;
}
~D ( )
{
cout << „Деструктор на производния клас“ << endl ;
}
} ;
вътр основен ( )
{
б * базов_ptr = нов д ;
Изтрий базов_ptr ;
}

Изход:
Резултатът показва, че използва указателен обект, който сочи към класа „B“ в основната функция. По този начин първо извиква „constructor()“ от клас „B“. След това извиква “constructor()” на класа “D”. След това указателният обект, който се държи от деструкторите на класовете „B“ и „D“, се изтрива. Без да извиква деструктора на клас „D“ в рамките на програмата, указателят на клас „B“ елиминира само деструктора на клас „B“. В резултат на това паметта на програмата е повредена.

Заключение

Обсъдихме концепцията за „виртуална конструкция“ в програмирането на C++. Проучихме, че не можем да създадем виртуалния конструктор в C++, но можем да създадем виртуалния деструктор в нашите кодове. Тук показахме какво се случи, когато създадем виртуалния конструктор в програмирането на C++ и работата на виртуалния деструктор в нашите кодове. Научихме, че конструкторът не може да бъде виртуален, но можем да генерираме виртуалния деструктор в нашия клас. Ние демонстрирахме някои примери и обяснихме подробно тези кодове в това ръководство.