這裏是一個simplified example:爲什麼不能shared_ptr解析函數接口中的繼承關係?
#include <memory>
#include <vector>
template< class T >
class K
{
public:
virtual ~K(){}
};
class KBOUM : public K<int>{};
template< class U >
void do_something(std::shared_ptr< K<U> > k) { }
int main()
{
auto kboom = std::make_shared<KBOUM>();
do_something(kboom); // 1 : error
std::shared_ptr< K<int> > k = kboom; // 2 : ok
do_something(k); // 3 : ok
}
帶或不帶助力,無論我使用編譯器我得到#錯誤1,因爲shared_ptr<KBOOM>
不從shared_ptr<K<int>>
繼承。 但是,KBOOM
確實繼承自K<int>
。你可以看到#2工作,因爲shared_ptr被設計爲允許隱式地將子類指針傳遞給基類指針,比如原始指針。
所以我的問題是:
- 什麼預防的std :: shared_ptr的實施者,使其在情況#1的工作(我的意思是,假設標準並防止這種情況下,應該有一個理由);
- 有沒有一種方法可以寫出
auto kboom = std::make_shared<KBOUM>(); do_something(kboom);
而不從KBOOM繼承的K中查看int類型?
注:我想避免功能的用戶有寫
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
或
do_something(std::shared_ptr<K<int>>(kboom));
爲什麼要讓'KBOUM'成爲派生類型而不是typedef? – ildjarn 2013-04-13 00:09:39
@ildjarn因爲它是一個簡化的例子,正如第一行所指出的那樣。在這個例子是簡化的真實代碼中,KBOUM不是空的,並且包含與K一起使用的參數的特定代碼。從K繼承的每種類型都會做一些不同的事情。 – Klaim 2013-04-13 20:25:27