>>> class base(object):
def __init__(self):
print('base init')
>>> class derived(base):
def __init__(self):
print('derived init')
super(derived, self).__init__()
>>> obj=derived()
derived init
base init
以上是最簡單的直接繼承用法,那如果是多繼承會是什麼情況呢?
>>> class base1(object):
def __init__(self):
print('base1 init')
>>> class base2(object):
def __init__(self):
print('base2 init')
>>> class derived(base1, base2):
def __init__(self):
print('derived init')
super(derived, self).__init__()
>>> obj=derived()
derived init
base1 init
從上面的結果可以看出,通過super的方式呼叫基類__init__實際只呼叫了第乙個繼承基類base1的__init__,而沒有呼叫第二個基類的__init__。
這個就涉及到python類的mro了,即method resolution order。
看看derived類的mro:
>>> help(derived)
help on class derived in module __main__:
class derived(base1, base2)
| method resolution order:
| derived
| base1
| base2
| __builtin__.object
上面的mro顯示了,尋找基類的方法會先查詢base1,然後再找base2,所以前面的例子呼叫了base1的__init__。
按照這種思路,那如果base1沒有定義__init__,是不是就該呼叫base2的__init__了呢?
我們來驗證一下:
>>> class base1(object):
pass
>>> class base2(object):
def __init__(self):
print('base2 init')
>>> class derived(base1, base2):
def __init__(self):
print('derived init')
super(derived, self).__init__()
>>> obj=derived()
derived init
base2 init
確實如此,呼叫了base2的__init__。
如果不想受到mro的影響,需要指定呼叫某些基類的__init__怎麼辦呢?
可以直接使用類名進行修飾:
>>> class derived(base1, base2):
def __init__(self):
print('derived init')
base2.__init__(self)
base1.__init__(self)
>>> obj=derived()
derived init
base2 init
base1 init
通過這種方式可以自行定製基類的初始化。 小技巧 陣列初始化
簡單說一下memset函式的使用方法。memset函式會把乙個型別的東西按位元組清空,乙個位元組是8位,所以按理講memset對int陣列實現統一賦值的操作的時候只能賦值0或者 1。如果不這樣的話,就會導致乙個迴圈出現。比如,你想對整個陣列賦值2的話,因為2的二進位制是10,八位的話就是0000,0...
虛擬基類的初始化
無論虛擬基類出現在繼承層次中的哪個位置上,它們都是在非虛擬基類之前被構造 虛擬基類的初始化成了最末層繼承類的責 namespace ex18 15 base string base const base protected string name class derived1 virtual pub...
虛基類的初始化
使用虛基類時,虛基類時被共享的,也就是在繼承體系中無論被繼承多少次,物件記憶體模型中均只會出現乙個虛基類的子物件,即使共享虛基類。但是必須要有乙個類來完成基類的初始化,同時還不能夠重複進行初始化。c 標準中選擇在每一次繼承子類中都必須書寫初始化語句,但是虛基類的初始化是由最後的子類完成,其他的初始化...