2016-09-23 43 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總是指向類的一個實例,其成員函數及其在this內部A始終是一個A*。所以typeid(decltype(*this))總是給你A

在另一方面,typeid(*this)將查找運行時類型信息,這將決定那個this確實是一個B(因爲A是一個多態型)。

+3

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

相關問題