Trong khi hai câu trả lời khác (here và here) đã tiếp cận vấn đề từ khía cạnh kỹ thuật và giải thích rất rõ lý do tại sao các trình biên dịch sẽ có một nhiệm vụ bất khả thi cố gắng để biên dịch mã mà bạn đã đặt cho nó, họ đã làm không giải thích vấn đề khái niệm với câu hỏi của bạn.
Đa hình có thể chỉ hoạt động khi chúng ta nói về mối quan hệ Lớp-phân lớp. Vì vậy, khi chúng tôi có tình hình như bạn đã mã hóa chúng ta có:
Chúng tôi đang nói "Tất cả các trường hợp của Derived
cũng là trường hợp của Base
". Lưu ý rằng điều này phải giữ hoặc chúng tôi thậm chí không thể bắt đầu nói về đa hình. Trong trường hợp này nó giữ và do đó chúng ta có thể sử dụng con trỏ đến Derived
nơi mã mong đợi một con trỏ đến Base
.
Nhưng sau đó bạn đang cố gắng làm điều gì đó khác nhau:
Và ở đây chúng tôi có một vấn đề. Trong khi trong lý thuyết tập, chúng ta có thể nói rằng một tập hợp một phân lớp cũng là một tập hợp của một siêu lớp, nó không đúng trong lập trình. Vấn đề là phần nào tăng lên bởi thực tế là sự khác biệt là "chỉ có hai ký tự". Nhưng một loạt các yếu tố là một cách hoàn toàn khác biệt, sau đó bất kỳ một trong những yếu tố đó.
Có lẽ nếu bạn viết lại mã sử dụng std::array
mẫu mà sẽ trở nên rõ ràng hơn:
#include <iostream>
#include <array>
struct Base
{
virtual ~Base()
{
std::cout << "~Base()" << std::endl;
}
};
struct Derived : Base
{
~Derived() override
{
std::cout << "~Derived()" << std::endl;
}
};
int main()
{
std::array<Base, 4>* p = new std::array<Derived, 4>;
delete[] p;
}
Mã này rõ ràng không thể biên dịch, các mẫu được không trở thành các lớp con của nhau tùy thuộc vào các thông số của họ. Theo cách này, giống như mong đợi một con trỏ đến một lớp để trở thành một con trỏ đến một lớp hoàn toàn không liên quan, điều này sẽ không hoạt động.
Hy vọng điều này sẽ giúp một số người muốn hiểu rõ hơn về những gì đang xảy ra, thay vì giải thích kỹ thuật.
Đa hình chỉ hoạt động thông qua con trỏ và các phần tử của mảng không phải là con trỏ, chúng là các loại giá trị. Bạn sẽ cần một mảng con trỏ và xóa chúng mỗi cá nhân. (hoặc một vector của con trỏ thông minh) – Galik
tôi đồng ý với nhận xét @Galik, nhưng nó hoạt động tốt cho tôi, hành vi đa hình thích hợp. sh-4.2 $ g ++ -std = C++ 11 -o chính * .cpp ~ Có nguồn gốc(): 2 ~ Cơ sở(): 1 ~ Nguồn gốc(): 2 ~ Cơ sở(): 1 ~ Có nguồn gốc(): 2 ~ Base(): 1 ~ Derived(): 2 ~ Base(): 1 – instance
Điều này sẽ không hoạt động như mảng sử dụng số học con trỏ để truy cập mảng els mà trong trường hợp của bạn là sizeof (Base) khi mặt khác một phần tử trong của bạn mảng là sizeof (có nguồn gốc) trong hậu quả khi truy cập mảng el Bạn sẽ kết thúc trong địa chỉ sai. – user3655463