我有以下代码:
class A
{
};
class B: public virtual A
{
public:
B()
{
cerr << "B()";
}
B(const A& a)
{
cerr << "B(const A&)";
}
};
class C: public B
{
};
int main(int argc, char **argv)
{
B *b = new B(C());
}
令我惊讶的是,B(const A&amp; a)没有被调用。那是为什么?
答案 0 :(得分:8)
B
还有一个隐式声明的复制构造函数,声明为
B(const B&);
这个隐式声明的成员函数被调用,因为它比用户声明的构造函数C
更适合类型B(const A&)
的参数。
答案 1 :(得分:1)
这是我在您的代码上尝试clang++ -cc1 -ast-dump
时获得的内容
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>)
正如您所看到的,您的类B
具有隐式声明的(编译器合成的)复制文件。
inline B(B const &) throw():
与James McNellis his answer中{{3}}类型的{{3}}类型更好匹配。这就是为什么你没有看到对C
的调用,因为它实际上从未被调用过。