継承元の右辺値参照

現在、古いソースコードの整理をしている。右辺値参照が出来たことに伴い、昔作ったデータ系のクラスにムーブコンストラクタを実装している。そこではまってしまった。普通のクラスなら別に問題ないのだが、継承しているクラスだととうも思うように動いてくれない。試しに以下のようなプログラムを書いて動かしてみた。

class Base
{
public:
	Base(){ std::cout << "Base default constractor" << std::endl; }
	virtual ~Base(){ std::cout << "Base destractor" << std::endl; }
	Base( const Base& ){ std::cout << "Base copy constractor" << std::endl; }
	Base( Base&& ){ std::cout << "Base move constractor" << std::endl; }
};

class Inh:public Base
{
public:
	Inh():Base(){ std::cout << "Inh default constractor" << std::endl; }
	virtual ~Inh(){ std::cout << "Inh destractor" << std::endl; }
	Inh( const Inh& r ):Base( r ){ std::cout << "Inh copy constractor" << std::endl; }
	Inh( Inh&& rr ):Base( rr ){ std::cout << "Inh move constractor" << std::endl; }
};

int main()
{
	Inh i1;
	Inh i2(std::move(i1));
}

そしたら結果は以下の通り

Base default constractor
Inh default constractor
Base copy constractor
Inh move constractor
Inh destractor
Base destractor
Inh destractor
Base destractor

あれ?継承元がムーブでなくコピーが呼ばれてる?ひょっとして右辺値参照ってポリモーフィズムが効かない?それ結構困るんだけど・・・。と考えた挙句、引数にムーブセマンティクスを入れてみた。

class Inh:public Base
{
public:
	Inh( Inh&& rr ):Base( std::move( rr ) ){ std::cout << "Inh move constractor" << std::endl; }
};

そしたら想定どおりに動きました。


まだまだ右辺値参照を完璧には理解出来ていないことを自覚しました。
ちなみにテスト環境はVS2010だけです。他は知りません(ぉ