這就是我,當我在你的代碼
class B : virtual public A {
class B;
public:
B() : A() (CompoundStmt 0xb85950 <a.cpp:9:5, line:11:5>)
B(A const &a) : A() (CompoundStmt 0xb859c0 <a.cpp:13:5, line:15:5>)
inline B &operator=(B const &) throw();
inline void ~B() throw();
inline B(B const &) throw() : A((ImplicitCastExpr 0xb86a10 <a.cpp:5:7> 'clas
s A const' <UncheckedDerivedToBase (virtual A)> lvalue
(DeclRefExpr 0xb869ec <col:7> 'class B const' ParmVar='' 0xb86170))
) (CompoundStmt 0xb86ab0 <a.cpp:5:7>)
試圖clang++ -cc1 -ast-dump
正如你可以看到你的B
類有一個隱式聲明(編譯器合成的)複製構造函數。
inline B(B const &) throw():
這是C
類型的更好匹配,James McNellis表示his answer。這就是爲什麼你沒有看到B(const A& a)
的呼叫,因爲它從來沒有被實際調用。
這與使用虛擬繼承的事實沒有任何關係;非虛擬繼承會表現出相同的行爲。 – 2010-09-21 15:23:09