Private VBA Class Initializer called from Factory
This is not so much an review but a variation of the OP's technique.   As  Mathieu Guindon mentioned in the comments the &quot;logic needs to be encapsulated&quot;.  My Caster class does just that.  The Person class is just for testing.
Caster:Class
Attribute VB_Name = &quot;Caster&quot;
Option Explicit

#If Mac Then
    #If VBA7 Then
        Private Declare PtrSafe Function CopyMemory Lib &quot;/usr/lib/libc.dylib&quot; Alias &quot;memmove&quot; (Destination As Any, Source As Any, ByVal Length As LongPtr) As LongPtr
    #Else
        Private Declare Function CopyMemory Lib &quot;/usr/lib/libc.dylib&quot; Alias &quot;memmove&quot; (Destination As Any, Source As Any, ByVal Length As Long) As Long
    #End If
#Else                                            'Windows
    'https://msdn.microsoft.com/en-us/library/mt723419(v=vs.85).aspx
    #If VBA7 Then
        Private Declare PtrSafe Sub CopyMemory Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; (Destination As Any, Source As Any, ByVal Length As LongPtr)
    #Else
        Private Declare Sub CopyMemory Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; (Destination As Any, Source As Any, ByVal Length As Long)
    #End If
#End If

#If Win64 Then
    Private Const PTR_SIZE As Long = 8
#Else
    Private Const PTR_SIZE As Long = 4
#End If

#If VBA7 Then
    Private SourcePointer As LongPtr
    Private DestinationPointer As LongPtr
#Else
    Private SourcePointer As Long
    Private DestinationPointer As Long
#End If

Public Sub SaveAs(ByRef Source As Object, ByRef Destination As Object)
    DestinationPointer = VarPtr(Source)
    Do
        DestinationPointer = DestinationPointer + PTR_SIZE
        CopyMemory SourcePointer, ByVal DestinationPointer, PTR_SIZE
    Loop Until SourcePointer = ObjPtr(Source)

    CopyMemory ByVal DestinationPointer, ObjPtr(Destination), PTR_SIZE
End Sub

Public Sub Restore()
    CopyMemory ByVal DestinationPointer, SourcePointer, PTR_SIZE
End Sub

Person:Class
Note:  The Init method is just to demonstrate the OP's original concept.  It could be replaced with  m = t.
Attribute VB_Name = &quot;Person&quot;
Attribute VB_PredeclaredId = True

Option Explicit

Private Type Members
    DOB As Date
    Name As String
    Sex As String
End Type

Private this As Members

Public Function Factory(pDOB As Date, pName As String, pSex As String) As Person
    DOB = pDOB
    Name = pName
    Sex = pSex
    Set Factory = Clone
End Function

Public Function Clone() As Person
    Dim Object As Person
    Set Object = New Person

    Dim Caster As New Caster
    
    Dim t As Members
    t = this
    Caster.SaveAs Me, Object
    Init t
    Caster.Restore
    Set Clone = Object
End Function

Private Sub Init(t As Members)
    this = t
End Sub

Public Property Get DOB() As Date

    DOB = this.DOB

End Property

Public Property Let DOB(ByVal Value As Date)

    this.DOB = Value

End Property

Public Property Get Name() As String

    Name = this.Name

End Property

Public Property Let Name(ByVal Value As String)

    this.Name = Value

End Property

Public Property Get Sex() As String

    Sex = this.Sex

End Property

Public Property Let Sex(ByVal Value As String)

    this.Sex = Value

End Property

Test
Sub TestClone()
    Dim Tom As New Person
    With Tom
        .DOB = #7/26/1970#
        .Name = &quot;Tom&quot;
        .Sex = &quot;M&quot;
    End With
    
    Debug.Print &quot;TestClone&quot;
    With Tom.Clone
        Tom.Name = &quot;Thomas&quot;
        Debug.Print &quot;DOB: &quot;, .DOB
        Debug.Print &quot;Name: &quot;, .Name
        Debug.Print &quot;Sex: &quot;, .Sex
    End With
    Debug.Print
End Sub

Sub TestFactory()
    Dim Tom As Person
    Set Tom = Person.Factory(#7/26/1970#, &quot;Tom&quot;, &quot;M&quot;)
    Person.Name = &quot;Thomas&quot;
    Debug.Print &quot;TestFactory&quot;
    With Tom
        Debug.Print &quot;DOB: &quot;, .DOB
        Debug.Print &quot;Name: &quot;, .Name
        Debug.Print &quot;Sex: &quot;, .Sex
    End With
End Sub