2016-09-23 11 views
7

仮想関数から基本クラスメソッドを派生クラスとして呼び出す方法はありますか? 例コード:派生として基本クラス関数を呼び出す

class A 
{ 
public: 
    virtual void a() = 0; 
    void print() { std::cerr << typeid(decltype(*this)).name(); }; 
}; 

class B : public A 
{ 
public: 
    virtual void a() { print(); } 
}; 

int main() 
{ 
    B b; 
    b.a(); //prints 1A, I want it to print 1B, is it even possible? 
} 
+0

'B'の' print'をオーバーライドします。 –

+5

'print'はバーチャルではありません... – SHR

+2

@SHRバーチャルにすることは助けになりません。実際のオーバーライドが必要です。http://coliru.stacked-crooked.com/a/b2c336a564ff315e –

答えて

14

だけdecltypeドロップ:

void print() { std::cerr << typeid(*this).name(); }; 
this

は常にメンバ関数の内のクラスのインスタンスを指すA内部this常にA*あります。だからtypeid(decltype(*this))はいつもあなたにAを与える。一方

Aは多相型であるため)、typeid(*this)thisが本当にBであることを決定するランタイムタイプ情報をルックアップします。

+3

[cool](http://coliru.stacked-crooked.com/a/56ee908e1d9b1ea4) –

関連する問題