2011-09-15 33 views
9

Tôi đang đọc một số văn bản C++ tại địa chỉ https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html.Sự đa hình tham số và bao gồm trong C++

Trong phần UNIVERSAL POLYMORPHISM, tác giả đã đề cập về các hình đa hình ParametricInclusion. Tôi không hoàn toàn chắc chắn rằng tôi hiểu được điểm, đặc biệt là lý do tại sao Parametric đa hình được thực hiện tại thời gian biên dịch trong khi Inclusion đa hình được thực hiện tại thời gian chạy?

Bất kỳ ai có thể cho tôi một lời giải thích rõ ràng hoặc một ví dụ, xin vui lòng?

+0

Bạn có thể bị can thiệp khi đọc câu trả lời này: http://stackoverflow.com/a/36949734/67634 – Zuu

Trả lời

9

"Parametric polymorphism" trong C++ nghĩa là mẫu.

I nghĩ rằng "bao gồm đa hình" trong C++ có nghĩa là đa hình theo cách tiêu chuẩn đề cập đến: phương pháp ảo, lớp con và các loại tương tự.

Tôi nghĩ rằng những cái tên này vụng về và có rất nhiều học viện.

+0

Chết tiệt, đánh tôi với nó. – Edwin

3

Tôi nghĩ bằng 'Tham số' nó đề cập đến method/function overloading - chúng ta có thể xác định phương pháp nào sẽ được sử dụng tại thời gian biên dịch bằng cách xem kiểu dữ liệu của các tham số của nó.

Và bằng cách 'bao gồm' nghĩa là method/function overriding - trong mối quan hệ cấp phụ huynh, nếu cả cấp độ gốc và lớp con đều có cùng chức năng thì nó sẽ được xác định trong thời gian chạy (tùy thuộc vào loại đối tượng) .

+0

Nếu bạn đọc gần hơn một chút, bạn nên hiểu rằng đa hình tham số chỉ áp dụng cho các phương thức quá tải làm điều tương tự. Tức là, 'foo ('8')' nên làm những điều tương tự (s) như 'foo (8)'. – Edwin

1

Tôi hiểu đa hình phổ quát khác với những gì chúng tôi mong đợi trong C++. C++ là đa hình ad-hoc.

Universal cho biết có thể chỉ có phiên bản của cùng một chữ ký, bất kể số lượng loại.

Tôi nghĩ rằng các câu trả lời khác lướt qua các chi tiết mà tham số và bao gồm là các danh mục phổ quát. Với văn bản gốc, tôi có thể thấy chúng bị lẫn lộn như thế nào. ;)

Với dưới đây:

struct Foo { 
    virtual void foo(); 
}; 

struct Bar { 
    virtual void bar(); 
    // virtual void foo(); // this would error 
}; 

Parametric sẽ như thế nào:

struct FooBar : public Foo, public Bar {}; 

Chữ ký chứa trong FooBar được tĩnh xác định tại thời gian biên dịch.

C++ không trực tiếp hỗ trợ đa hình bao gồm. Chúng sẽ gần hơn với việc tiêm mà bạn có thể tìm thấy trong các ngôn ngữ kịch bản mà các hàm được đặt hàng đầu tiên.

Xin vui lòng không lấy mã này theo nghĩa đen, nó chỉ là để trình diễn.

struct FooBar {}; 

int main() { 
    FooBar foob; 
    foob.foo = Foo::foo; 
    foob.bar = Bar::bar; 
    return 0; 
} 

FooBar không biết giao diện của nó tại thời gian biên dịch, được tạo động. Tôi đã sử dụng hành vi tương tự trong javascript và Lua, và tôi chắc chắn nhiều người khác có những thứ tương tự.

Các vấn đề liên quan