C3 linearization

C3 linearization演算法可以拿來解決多重繼承的方法優先呼叫順序(Method Resolution Order)。 以下是經典的diamond problem A / \ B C \ / D B繼承A, C繼承A, D繼承B, C。 由於在C++內沒有實作,所以這樣寫是會產生錯誤的。 #include <iostream> using namespace std; class A { public: void foo() { cout << "I'm A" << endl; } }; class B: public A { public: void foo() { cout << "I'm B" << endl; } }; class C: public A { public: void foo() { cout << "I'm C" << endl; } }; class D: public B, C {}; int main() { D d = D(); d.foo(); return 0; } $ clang diamond.cpp # diamond.cpp:31:7: error: member 'foo' found in multiple base classes of # different types # d.foo(); # ^ # diamond.cpp:14:10: note: member found by ambiguous name lookup # void foo() { # ^ # diamond.cpp:21:10: note: member found by ambiguous name lookup # void foo() { # ^ # 1 error generated. 但在python3卻有不一樣的結果 ...