3

我有以下代码:

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& a) 没有被调用。这是为什么?

4

2 回答 2

8

B还有一个隐式声明的复制构造函数,声明为

B(const B&);

调用这个隐式声明的成员函数是因为它C比用户声明的构造函数更适合类型参数B(const A&)

于 2010-09-21T14:59:57.847 回答
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有一个隐式声明(编译器合成)的复制 ctor。

inline B(B const &) throw():正如James McNellis他的回答中所说,这更适合类型C参数。这就是为什么您看不到调用的原因,因为它实际上从未被调用过。B(const A& a)

于 2010-09-21T15:10:48.857 回答