C++ 가상 생성자

C Gasang Saengseongja



C++에서는 클래스 생성자를 재정의하는 것이 불가능하므로 가상 생성자를 생성하는 데 도움이 되지 않습니다. 따라서 생성자 가상화는 의미가 없습니다. C++ 프로그램에는 가상 생성자를 생성한다는 개념이 없지만 거기에서 가상 소멸자를 생성할 수는 있습니다. C++에서 생성자를 프로그래밍하는 것은 클래스의 생성자가 호출될 때 메모리에 가상 포인터가 생성되지 않음을 나타내는 가상 테이블이 없기 때문에 가상으로 간주될 수 없기 때문에 이를 정의할 수도 있습니다. 따라서 생성자는 항상 가상이 아니어야 합니다.

그러나 가상 소멸자가 존재할 수 있습니다. 여기서는 C++에서 가상 생성자를 만들 때 어떤 일이 발생하는지와 가상 생성자 대신 가상 소멸자의 작동 방식을 보여줍니다.

예시 1:

가상 생성자를 만들고 'iostream' 헤더 파일을 배치하여 코드를 시작하겠습니다. 이 헤더 파일은 'cin' 및 'cout'과 같이 선언된 함수용입니다. 그런 다음 'std' 네임스페이스를 추가하므로 코드의 모든 함수에 이 'std'를 추가할 수 없습니다. 그런 다음 'my_base'라는 이름으로 코드의 기본 클래스인 클래스를 만든 다음 'public'을 추가하여 가상 생성자를 만듭니다.







여기에 'virtual' 키워드를 배치하여 가상 생성자를 생성합니다. 이 가상 생성자 안에 'cout' 문을 배치합니다. 아래에서는 'cout'을 다시 활용하는 'show'라는 함수를 만듭니다. 그런 다음 'my_derived'라는 이름으로 이 기본 클래스의 파생 클래스를 만든 다음 'public' 필드에 'my_derived()' 생성자를 설정합니다. 이 'my_derived()' 생성자에 'cout' 문을 삽입합니다. 그 아래에는 'cout'을 다시 한 번 사용하는 'show'라는 함수를 구성합니다.



이제 'main()'을 호출한 후 'my_ptr'이라는 이름으로 기본 클래스의 포인터를 만들고 파생 클래스인 'Obj_d'의 개체도 만듭니다. 그런 다음 'Obj_d'의 주소를 'my_ptr'에 할당합니다. 그런 다음 'my_ptr'을 통해 'show()' 함수를 호출합니다.



코드 1:





#include
사용하여 네임스페이스 성병 ;
수업 내_베이스
{
공공의 :
가상 내_베이스 ( )
{
시합 << '여기 내 기본 클래스가 있습니다.' << ;
}
무효의 보여주다 ( )
{
시합 << '기본 클래스의 표시 기능' << ;
}
} ;
수업 내_파생 : 공공의 내_베이스
{
공공의 :
내_파생 ( )
{
시합 << '여기 내 파생 클래스가 있습니다.' << ;
}
무효의 보여주다 ( )
{
시합 << '파생 클래스의 표시 기능' < 보여주다 ( ) ;
}

산출:
여기서는 C++ 프로그래밍에서 생성자를 가상으로 선언할 수 없다는 오류 메시지를 보여줍니다. 따라서 C++에서는 가상 생성자를 생성할 수 없지만 가상 소멸자를 생성할 수는 있음을 알 수 있습니다.



예 2:

이전 문제를 해결하고 이 코드에서 가상 소멸자를 만들어 보겠습니다. “new_base” 클래스를 선언한 후 “new_base”에 “virtual ~”를 추가하여 가상 소멸자를 생성하는 “public” 생성자를 배치합니다. 이 가상 소멸자에 'cout' 문을 삽입합니다. 그 아래에는 'cout'을 사용하는 'show'라는 함수를 구성합니다. 다음으로, 이 'new_base' 기본 클래스의 'new_derived'인 파생 클래스를 만들고 'public' 필드에 'new_derived()' 소멸자를 구성합니다. 이 'new_derived()' 소멸자에는 이제 'cout' 문이 추가되었습니다.

그 아래에는 'cout' 문을 다시 사용하는 'show'라는 함수를 만듭니다. 'main()' 함수를 호출한 후 이제 'obj_d' 파생 클래스의 개체와 'ptr1'이라는 기본 클래스의 포인터를 생성합니다. 그런 다음 'obj_d' 주소를 'ptr1'에 제공합니다. 다음으로 'ptr1'을 사용하여 'show()' 메서드가 호출됩니다.

코드 2:

#include
사용하여 네임스페이스 성병 ;
수업 new_base
{
공공의 :
가상 ~new_base ( )
{
시합 << '기본 클래스 소멸자가 여기에 있습니다.' << ;
}
무효의 보여주다 ( )
{
시합 << '기본 클래스의 표시 기능' << ;
}
} ;
수업 new_derived : 공공의 new_base
{
공공의 :
~new_derived ( )
{
시합 << '파생 클래스 소멸자가 여기에 있습니다.' << ;
}
무효의 보여주다 ( )
{
시합 << '기본 클래스의 표시 기능' < 보여주다 ( ) ;
}

산출:
이 프로그램은 'obj_d' 파생 클래스를 가리키는 'new_base'의 포인터 개체를 사용합니다. 따라서 “new_base” 클래스의 “show()” 메서드를 먼저 호출합니다. 그런 다음 'new_derived' 클래스의 '~new_derived()' 메서드를 호출하고 기본 클래스의 '~new_base'를 표시합니다.

예시 3:

'가상' 생성자를 생성하는 또 다른 코드는 다음과 같습니다. 'iostream'과 'std' 네임스페이스를 포함시킨 후 'B' 클래스를 생성합니다. 아래에서는 'B()'라는 'public' 생성자를 만든 다음 'cout'을 생성합니다. 생성자와 소멸자 함수는 클래스의 모든 개체가 호출할 수 있는 '공용' 액세스 지정자를 활용하여 정의됩니다.

이제 'cout'을 다시 활용하는 이 기본 클래스의 '~B()' 소멸자를 생성합니다. 그런 다음 'B' 기본 클래스의 파생 클래스인 'D' 클래스를 만들고 여기에 'public'을 배치합니다. 이 'public' 내에서 파생 클래스의 생성자와 소멸자를 각각 'D()' 및 '~D'라는 이름으로 만듭니다. 둘 다 그 안에 'cout'을 포함합니다. 이제 “main()” 함수가 생겼습니다. 이 함수를 호출한 후 기본 클래스의 포인터 개체를 생성합니다.

그런 다음 'delete' 키워드를 사용하고 여기에 'base_ptr'을 배치합니다. 이 경우 기본 클래스의 포인터 객체를 호출하여 소멸자의 공간을 삭제합니다.

코드 3:

#include
사용하여 네임스페이스 성병 ;
수업
{
공공의 :
( )
{
시합 << '기본 클래스의 생성자' << ;
}
~B ( )
{
시합 << '기본 클래스의 소멸자' << ;
}
} ;

수업 : 공공의
{
공공의 :
( )
{
시합 << '파생 클래스의 생성자' << ;
}
~D ( )
{
시합 << '파생 클래스의 소멸자' << ;
}
} ;
정수 기본 ( )
{
* 베이스_포인트 = 새로운 ;
삭제 베이스_포인트 ;
}

산출:
결과는 주 함수의 'B' 클래스를 가리키는 포인터 개체를 사용한다는 것을 보여줍니다. 따라서 'B' 클래스의 'constructor()'를 먼저 호출합니다. 그런 다음 'D' 클래스의 'constructor()'를 호출합니다. 그런 다음 'B' 및 'D' 클래스의 소멸자가 보유한 포인터 개체가 삭제됩니다. 프로그램 내에서 'D' 클래스의 소멸자를 호출하지 않고 'B' 클래스 포인터는 'B' 클래스의 소멸자만 제거합니다. 결과적으로 프로그램의 메모리가 손상되었습니다.

결론

우리는 C++ 프로그래밍의 '가상 구성' 개념에 대해 논의했습니다. C++에서는 가상 생성자를 생성할 수 없지만 코드에서는 가상 소멸자를 생성할 수 있다는 점을 살펴보았습니다. 여기에서는 C++ 프로그래밍에서 가상 생성자를 생성할 때 어떤 일이 발생했는지와 코드에서 가상 소멸자의 작동 방식을 보여주었습니다. 생성자는 가상일 수 없지만 클래스에서 가상 소멸자를 생성할 수 있다는 것을 배웠습니다. 이 가이드에서는 몇 가지 예를 보여주고 이러한 코드를 철저하게 설명했습니다.