2014-02-07 171 views
5

在我的代碼,我有這些類實現:C++:調用從父實例子方法

class A 
{ 
    public: 
    virtual int fun() { return 0; } 
} 

class B : public A 
{ 
    public: 
    virtual int fun() { return 1; } 
} 

而這些功能:

void operation(A a) 
{ 
    printf("%d\n",a.fun()); 
} 

int main() 
{ 
    B b; 
    operation(b); 
    return 0; 
} 

正如你所看到的,B類繼承A,並實現了虛擬繼承方法fun()。主類調用一個函數,該函數在參數中使用A並使用參數中的B對象調用fun()方法。

在執行過程中,我期望打印字符串"1",但它是"0"(即使它是傳遞給operation()的B對象)。

我需要這樣做,因爲我有幾個B類(B1,B2等......),我希望功能operation()是通用的。 我不需要在類A中實現operation(),但是如果我聲明operation()純虛擬,編譯失敗operation()說我不能實例化A(這是相當期望的)。

我發現了很多關於父/子方法調用和繼承的話題,但他們都沒有精確地討論過這個問題。

有人可以幫助我嗎?

謝謝。

+0

小心:對於對象的默認構造,不得使用括號。 'B b()'不會調用'B'的默認c'tor,但是聲明一個函數'b',它不接受任何參數並返回一個類'B'的對象。 –

+0

這只是我編寫這個簡化的代碼示例時所犯的一個錯誤 – Vultrao

回答

9

你需要按引用傳遞對象或傳遞一個指針

void operation(A& a) 

因爲你是按值傳遞,派生的對象被切片 - A類型的新對象的範圍創建功能。

+0

現在看起來很明顯,你說了這個。現在工作正常,非常感謝^^! – Vultrao