Reputation: 127
#include<iostream>
using namespace std;
class A
{
public:
A(){ cout <<"1";}
A(const A &obj){cout <<"2";}
};
class B: virtual A
{
public:
B(){cout <<"3";}
B(const B & obj):A(obj){cout<<"4";}
};
class C: virtual A
{
public:
C(){cout<<"5";}
C(const C & obj):A(obj){cout <<"6";}
};
class D:B,C
{
public:
D(){cout<<"7";}
D(const D & obj):C(obj),B(obj){cout <<"8";}
};
int main()
{
D d1;
D d(d1);
}
I am getting 13571468 as output. But I think that output should be 13572468. Why normal constructor is running instead on of copy constructor of class A?
Upvotes: 8
Views: 6989
Reputation: 118340
Your code makes a copy of an instance of D
, invoking its copy constructor.
Your class D
's copy constructor only invokes the copy constructors of its C
and B
's superclasses. Because it does not invoke A
's copy constructor, it gets default-constructed.
Virtually-inherited classes can be thought of as direct superclasses of the most-derived class. That's what virtual inheritance means. As such, in your instance of D
, its virtually-inherited A
is a direct superclass of D
, and not of B
or C
; as such, B
and C
's invocations of A
copy-constructor is not invoked.
When you have a virtually-inherited class, all your constructors really have two versions created "behind the scenes": one that's responsible for constructing any virtually-inherited classes, and one that's not. The one that's not does not call the virtually-inherited classes's constructors.
Upvotes: 12