2012-02-14 55 views
23

Giả sử chúng ta có lớp cơ sở trừu tượng IBase với các phương thức ảo thuần túy (một giao diện).Có thể truyền các lớp dẫn xuất bằng cách tham chiếu đến một hàm lấy lớp cơ sở làm tham số

Sau đó, chúng tôi lấy được CFoo, CFoo2 từ lớp cơ sở.

Và chúng tôi có một chức năng biết cách làm việc với IBase.

Foo(IBase *input); 

Kịch bản bình thường trong những trường hợp này là như thế này: quản lý

IBase *ptr = static_cast<IBase*>(new CFoo("abc")); 
Foo(ptr); 
delete ptr; 

Nhưng con trỏ là tốt hơn để tránh được, vậy là có một cách để sử dụng tài liệu tham khảo trong kịch bản như vậy?

CFoo inst("abc"); 
Foo(inst); 

nơi Foo là:

Foo(IBase &input); 
+2

Có, những gì bạn có trong câu hỏi của mình là lý tưởng. – ildjarn

+28

Có; đa hình hoạt động cho cả hai con trỏ và tham chiếu. Và ngừng đúc, làm ơn. Chúng ta không ở Hollywood. –

Trả lời

39

Yes. Bạn không cần phải upcast các đối tượng của bạn. Tất cả các tham chiếu/con trỏ tới các kiểu dẫn xuất được chuyển đổi hoàn toàn thành các tham chiếu đối tượng cơ sở/con trỏ khi cần thiết.

Vì vậy:

IBase* ptr = new CFoo("abc"); // good 
CFoo* ptr2 = static_cast<CFoo*>(ptr); // good 
CFoo* ptr3 = ptr; // compile error 

CFoo instance("abc"); 
IBase& ref = instance; // good 
CFoo& ref2 = static_cast<CFoo&>(ref); // good 
CFoo& ref3 = ref; // compile error 

Khi bạn phải downCast bạn có thể muốn xem xét sử dụng dynamic_cast, nếu loại của bạn là đa hình.

+0

Tôi đã tìm thấy vấn đề của mình ở đâu. Tôi đã sử dụng 'Foo (CFoo (" abc "));' mà không được biên dịch. – Coder

+3

@Coder: Trong trường hợp bạn không biết, lý do đó là một vấn đề là vì bạn đang chuyển 'Foo' một giá trị, và rvalues ​​không thể liên kết với tham chiếu không phải lvalue (ví dụ, nếu' Foo' là 'Foo (IBase const & input); 'thay vào đó, nó sẽ biên dịch). – ildjarn

0

Bạn có thể truyền một đối tượng giống như con trỏ. Tôi nhớ điều này là phổ biến khi chuyển đổi char thành unsigned char và các dấu hiệu thay đổi ký hiệu khác trong những ngày bị đau.

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