ページ 11

[C++]std::make_sharedとアップキャスト

Posted: 2016年5月21日(土) 10:17
by moba
お世話になります_(._.)_

Visual C++ 2010 Expressで次のように書きました。
コンパイルエラーの理由を教えていただけませんか。

コード:

#include <memory>

class Base
{
public:
	virtual void Update() = 0;
	virtual ~Base() {}
};

class Derived : public Base
{
	void Update(){}
};

void Test() {
	std::shared_ptr<Base> testA = std::make_shared<Derived>(); // エラーなし
	auto testB = std::make_shared<Base>( Derived() ); // error C2259: 'Base' : 抽象クラスをインスタンス化できません。
}
エラー文の続きは、

error C2259: 'Base' : 抽象クラスをインスタンス化できません。
次のメンバーが原因です:
'void Base::Update(void)' : は抽象型です0

です。よろしくお願いします。

Re: [C++]std::make_sharedとアップキャスト

Posted: 2016年5月21日(土) 11:56
by a5ua
std::make_shared<Base>(...); は内部で
new Base(...); 相当のことを実行しています。

純粋仮想関数を含むクラスのインスタンスを
生成することはできないので、そのようなエラーが出ているのでしょう

Re: [C++]std::make_sharedとアップキャスト

Posted: 2016年5月21日(土) 12:36
by moba
ではこのケースでは、具体的に
std::make_shared<Base>( Derived() )
はどのように実行されますか。