Daily Archives: January 21, 2022

One Definition Rule – class type

最近在幫忙debug看到一段有意思的程式碼 我把出問題程式核心概念抽出來碼簡化改寫如下 以上程式碼在VC++2015環境下執行 class2.cpp dynamic_cast fail! 如果單純只看class2.cpp ClassC2* p2 = dynamic_cast(p.get()); std::cout << “Class2 ” << p2 << std::endl; 看起來沒有什麼問題,shared_ptr<Class2C1> p 被assign new ClassC2 , 再取出來做dynamic_cast轉回ClassC2 dynamic_cast失敗所以return nullptr,但是shared_ptr p 裡頭存的不是ClassC2 pointer嗎? 應該要能夠down cast成功 如果仔細看,會發現ClassC2同時在class1.cpp, class2.cpp被定義了! 為什麼compile時沒報任何錯呢? 例如redefinition,原因是compile是針對translation unit,在同一個translation unit不能有重複定義,但是在不同的translation unit,標準允許可以重複定義(class … Continue reading

Posted in C++ Language | Leave a comment