Trình xây dựng ảo C++

Trinh Xay Dung Ao C



C++ không hỗ trợ chúng ta xây dựng các hàm tạo ảo vì không thể ghi đè hàm tạo của lớp. Vì vậy, ảo hóa hàm tạo là vô nghĩa. Không có khái niệm về việc tạo hàm tạo ảo trong chương trình C++, nhưng chúng ta có thể tạo hàm hủy ảo ở đó. Chúng ta cũng có thể định nghĩa nó vì việc lập trình một hàm tạo trong C++ không thể được coi là ảo vì khi hàm tạo của một lớp được gọi ra, bộ nhớ không chứa bảng ảo cho biết rằng không có con trỏ ảo nào được tạo. Vì vậy, hàm tạo phải luôn không ảo.

Tuy nhiên, một hàm hủy ảo có thể tồn tại. Ở đây, chúng tôi sẽ trình bày điều gì sẽ xảy ra khi chúng tôi tạo một hàm tạo ảo trong C++ cũng như hoạt động của hàm hủy ảo thay vì hàm tạo ảo.

Ví dụ 1:

Hãy tạo hàm tạo ảo và bắt đầu mã của chúng ta bằng cách đặt tệp tiêu đề “iostream”. Tệp tiêu đề này dành cho các hàm được khai báo trong đó như “cin” và “cout”. Sau đó, chúng tôi thêm không gian tên “std”, vì vậy chúng tôi không thể thêm “std” này với mọi hàm trong mã của mình. Sau đó, chúng ta tạo một lớp là lớp cơ sở của mã của chúng ta với tên “my_base” và sau đó thêm “public” để tạo hàm tạo ảo.







Hàm tạo ảo được tạo ở đây bằng cách đặt từ khóa “ảo”. Bên trong hàm tạo ảo này, chúng ta đặt một câu lệnh “cout”. Bên dưới phần này, chúng ta tạo một hàm có tên là “show” trong đó chúng ta sử dụng lại “cout”. Sau đó, chúng ta tạo một lớp dẫn xuất của lớp cơ sở này với tên “my_ Derivative” và sau đó thiết lập hàm tạo “my_ Derivative()” trong trường “public”. Chúng ta chèn một câu lệnh “cout” vào hàm tạo “my_ Derivative()” này. Bên dưới nó, chúng ta xây dựng một hàm có tên là “show” trong đó chúng ta sử dụng lại “cout”.



Bây giờ, sau khi gọi “main()”, chúng ta tạo một con trỏ của lớp cơ sở với tên “my_ptr” và cũng tạo đối tượng của lớp dẫn xuất là “Obj_d”. Sau đó, chúng tôi gán địa chỉ của “Obj_d” cho “my_ptr”. Sau đó, chúng ta gọi hàm “show()” thông qua “my_ptr”.



Mã 1:





#include
sử dụng không gian tên tiêu chuẩn ;
lớp học cơ sở của tôi
{
công cộng :
ảo cơ sở của tôi ( )
{
cout << 'Đây là lớp cơ sở của tôi' << kết thúc ;
}
trống rỗng trình diễn ( )
{
cout << 'chức năng hiển thị của lớp cơ sở' << kết thúc ;
}
} ;
lớp học my_có nguồn gốc : công cộng cơ sở của tôi
{
công cộng :
my_có nguồn gốc ( )
{
cout << 'Đây là lớp dẫn xuất của tôi' << kết thúc ;
}
trống rỗng trình diễn ( )
{
cout << 'hàm hiển thị của lớp dẫn xuất' < trình diễn ( ) ;
}

Đầu ra:
Ở đây, nó hiển thị một thông báo lỗi cho biết rằng hàm tạo không thể được khai báo là ảo trong lập trình C++. Vì vậy, chúng ta có thể thấy rằng C++ không cho phép chúng ta tạo hàm tạo ảo nhưng chúng ta có thể tạo hàm hủy ảo.



Ví dụ 2:

Hãy giải quyết vấn đề trước đó và tạo hàm hủy ảo trong mã này. Sau khi khai báo lớp “new_base”, chúng ta đặt hàm tạo “public” trong đó chúng ta tạo hàm hủy ảo bằng cách thêm “ảo ~” với “new_base”. Chúng tôi chèn một câu lệnh “cout” vào hàm hủy ảo này. Bên dưới nó, chúng ta xây dựng một hàm có tên là “show” sử dụng “cout”. Tiếp theo, chúng ta tạo một lớp dẫn xuất là “new_derivation” của lớp cơ sở “new_base” này và xây dựng hàm hủy “new_ Derivative()” trong trường “public”. Hàm hủy “new_der()” này hiện có câu lệnh “cout” được thêm vào.

Bên dưới nó, chúng ta tạo một hàm có tên là “show” sử dụng lại câu lệnh “cout”. Sau khi gọi hàm “main()”, bây giờ chúng ta tạo ra một đối tượng của lớp dẫn xuất “obj_d” cũng như một con trỏ của lớp cơ sở có tên là “ptr1”. Sau đó, chúng tôi cung cấp địa chỉ “obj_d” cho “ptr1”. Tiếp theo, phương thức “show()” được gọi bằng cách sử dụng “ptr1”.

Mã 2:

#include
sử dụng không gian tên tiêu chuẩn ;
lớp học cơ sở mới
{
công cộng :
ảo ~cơ sở mới ( )
{
cout << 'Hàm hủy lớp cơ sở ở đây' << kết thúc ;
}
trống rỗng trình diễn ( )
{
cout << 'Chức năng hiển thị của lớp cơ sở' << kết thúc ;
}
} ;
lớp học new_derivation : công cộng cơ sở mới
{
công cộng :
~mới_có nguồn gốc ( )
{
cout << 'Hàm hủy lớp dẫn xuất ở đây' << kết thúc ;
}
trống rỗng trình diễn ( )
{
cout << 'Chức năng hiển thị của lớp cơ sở' < trình diễn ( ) ;
}

Đầu ra:
Chương trình này sử dụng một đối tượng con trỏ “new_base” trỏ đến lớp dẫn xuất “obj_d”. Do đó, nó gọi phương thức “show()” của lớp “new_base” trước tiên. Sau đó, nó gọi phương thức “~new_ Derivative()” của lớp “new_ Derivative” và hiển thị “~new_base” của lớp cơ sở.

Ví dụ 3:

Đây là một đoạn mã khác để tạo hàm tạo “ảo”. Sau khi bao gồm không gian tên “iostream” và “std”, chúng ta tạo ra một lớp “B”. Bên dưới phần này, chúng ta tạo hàm tạo “công khai” là “B()” và sau đó tạo “cout”. Hàm tạo và hàm hủy được xác định bằng cách sử dụng bộ xác định truy cập “công khai” trong đó bất kỳ đối tượng nào trong lớp đều có thể gọi.

Bây giờ, chúng ta cũng tạo hàm hủy “~B()” của lớp cơ sở này, trong đó chúng ta sử dụng lại “cout”. Sau đó, chúng ta tạo lớp “D” là lớp dẫn xuất của lớp cơ sở “B” và đặt “public” ở đây. Bên trong “public” này, chúng ta tạo ra hàm tạo cũng như hàm hủy của lớp dẫn xuất với tên lần lượt là “D()” và “~D”. Cả hai đều chứa “cout” bên trong chúng. Bây giờ chúng ta có hàm “main()”. Sau khi gọi hàm này, chúng ta tạo đối tượng con trỏ của lớp cơ sở.

Sau đó, chúng tôi sử dụng từ khóa “xóa” và đặt “base_ptr” tại đây. Trong trường hợp này, không gian của hàm hủy sẽ bị xóa bằng cách gọi đối tượng con trỏ của lớp cơ sở.

Mã 3:

#include
sử dụng không gian tên tiêu chuẩn ;
lớp học B
{
công cộng :
B ( )
{
cout << 'Trình xây dựng của lớp cơ sở' << kết thúc ;
}
~B ( )
{
cout << 'Kẻ hủy diệt của lớp cơ sở' << kết thúc ;
}
} ;

lớp học D : công cộng B
{
công cộng :
D ( )
{
cout << 'Hàm tạo của lớp dẫn xuất' << kết thúc ;
}
~D ( )
{
cout << 'Trình hủy của lớp dẫn xuất' << kết thúc ;
}
} ;
int chủ yếu ( )
{
B * base_ptr = mới D ;
xóa bỏ base_ptr ;
}

Đầu ra:
Kết quả cho thấy nó sử dụng một đối tượng con trỏ trỏ đến lớp “B” trong hàm main. Do đó, nó gọi “constructor()” của lớp “B” trước tiên. Sau đó, nó gọi “constructor()” của lớp “D”. Sau đó, đối tượng con trỏ được giữ bởi các hàm hủy của lớp “B” và “D” sẽ bị xóa. Không gọi hàm hủy của lớp “D” trong chương trình, con trỏ lớp “B” chỉ loại bỏ hàm hủy của lớp “B”. Kết quả là bộ nhớ của chương trình bị hỏng.

Phần kết luận

Chúng tôi đã thảo luận về khái niệm “Xây dựng ảo” trong lập trình C++. Chúng tôi đã khám phá ra rằng chúng tôi không thể tạo hàm tạo ảo trong C++, nhưng chúng tôi có thể tạo hàm hủy ảo trong mã của mình. Ở đây, chúng tôi đã trình bày điều gì đã xảy ra khi chúng tôi tạo hàm tạo ảo trong lập trình C++ và cách hoạt động của hàm hủy ảo trong mã của chúng tôi. Chúng ta đã biết rằng hàm tạo không thể ảo nhưng chúng ta có thể tạo hàm hủy ảo trong lớp của mình. Chúng tôi đã trình bày một số ví dụ và giải thích kỹ lưỡng các mã này trong hướng dẫn này.