2012-08-09 63 views
0

在以下code爲什麼要調用基函數?

#include <iostream> 
using namespace std; 

class A { 
    public: 
    A() { 
     cout << " A constructor \n"; 
     sum(2,4); 
    } 
    virtual int sum(int a, int b){ 
     cout << "Base sum \n"; 
     return a + b; 
    } 
}; 

class B : public A { 
    public: 
    B() : A() { 
     cout << " B constructor \n"; 
    } 

    int sum(int a, int b){ 
     cout << "Overloaded sum \n"; 
     return (a + b) * 10; 
    } 
}; 

int main(){ 
    A* a = new B(); 
    // a->sum(4,5); 
} 

爲什麼即使我已經將其標記爲虛擬和重載它在B A的總和調用?在運行時,在vtable的幫助下不應調用B :: sum()。

+0

「_overloaded_」不,你重寫它! – curiousguy 2012-08-15 02:33:45

+0

@curiousguy ??? – brainydexter 2012-08-15 16:55:27

+0

這裏沒有超載。 – curiousguy 2012-08-15 22:19:51

回答

5

因爲當您調用方法時,a還不是B類型的對象。

避免從構造函數調用virtual方法:它會導致意想不到的結果(除非你期待這種確切的行爲,在這種情況下你會發現)。

在運行時,在vtable的幫助下不應該調用B :: sum()嗎?

不是真的,因爲該對象在該點沒有vtableB

+2

爲了完整性,類似的東西適用於從析構函數進行這種調用。 – juanchopanza 2012-08-09 05:58:24

+1

我很好奇學習。從構造函數調用虛擬方法的缺點(意外的結果)是什麼? (除了調用虛函數,並期待派生函數將被調用) – brainydexter 2012-08-09 05:59:24

+0

@juanchopanza請你詳細說明一下嗎? – brainydexter 2012-08-09 06:00:18

0

當您實例化派生類時,將首先執行基構造函數。這意味着,當基礎構造函數正在執行時,派生對象的構造尚未完成。

通過將構造函數中的動作限制爲它的意圖避免這些情況:初始化對象。

相關問題