在基類構造器中呼叫虛方法需謹慎

2021-09-07 22:35:36 字數 1629 閱讀 8367

最近,在基類的建構函式中呼叫虛方法時,發現了乙個問題。先把問題重現如下:

class program
}
public

class people

protected people()
public

virtual

void say()

歲了", age));
}
}
public

class chinese : people

public

override

void say()

歲了",age));
}
}
執行以上的**,結果會是以下兩種情況之一嗎?

基類說我今年18歲了

子類說我今年18歲了

都不是!而是:

為什麼?

→呼叫子類建構函式new chinese(18)

→先呼叫父類無參建構函式,並呼叫虛方法say

→發現虛方法say有過載,就呼叫子類chinesesay的過載,但此時子類chinese還沒有對age屬性初始化,此時的age屬性值為預設值0

如何避免呢?

--去掉在基類建構函式中呼叫虛方法的**

--用子類例項呼叫過載方法

class program
}
public

class people

protected people()
public

virtual

void say()

歲了", age));
}
}
public

class chinese : people

public

override

void say()

歲了",age));
}
}

總結:當在基類建構函式中呼叫虛方法需謹慎,因為當父類呼叫虛方法過載的時候,子類還沒有被初始化,可能會涉及到一些成員還未被初始化。

在基類建構函式中呼叫虛擬方法

在c builder中,vcl風格物件的執行時型別,是派生類的型別,並在呼叫基類建構函式期間不變。因此,如果基類構造函式呼叫乙個虛擬的方法,當派生類過載它時,派生類的方法將被呼叫,基類的不被呼叫。如果這個虛擬方法依賴於派生類建構函式體或初始化列表中的任何東西,方法仍在派生類建構函式之前被呼叫。例如c...

在派生類中呼叫基類方法。

base 關鍵字用於從派生類中訪問基類的成員 呼叫基類上已被其他方法重寫的方法。指定建立派生類例項時應呼叫的基類建構函式。基類訪問只能在建構函式 例項方法或例項屬性訪問器中進行。示例 在派生類中呼叫基類方法。base 關鍵字 訪問基類成員 using system public class base...

顯示呼叫基類的構造方法

def init self,例項 乙個物件裡面可以包含許多物件,可以層層呼叫。student類繼承human類的特徵,並增加了乙個score新屬性 doctor類繼承student類的特徵,並增加乙個grad新屬性。繼承父類的方法通過super 函式來實現。super student,self in...