Re: Virtual inheritance + copy constructor pitfall
* Marcin Kalicinski:
Hi,
Having the following program:
#include <iostream>
struct A
{
A() { std::cout << "A::A()\n"; }
A(const A &) { std::cout << "A::A(const A &)\n"; }
};
struct B: virtual public A
{
B() { std::cout << "B::B()\n"; }
B(const B &b): A(b) { std::cout << "B::B(const B &)\n"; }
};
struct C: public B
{
C() { std::cout << "C::C()\n"; }
C(const C &c): B(c) { std::cout << "C::C(const C &)\n"; }
};
int main()
{
C c;
std::cout << "---\n";
C c2(c);
}
Why does it print:
A::A()
B::B()
C::C()
---
A::A() <--- here
B::B(const B &)
C::C(const C &)
I.e. why is copy constructor for A not called, but default constructor is
called instead?
Constructors of virtual base classes have to be called (implicitly, or
explicitly via constructor initializer list) in the most derived class.
Otherwise, in the context of multiple inheritance, where the virtual
base class object is shared between two or more derived class objects,
you could get multiple calls of constructors on the same virtual base
class object, and the ordinary rules for C++ guarantee exactly one
constructor call per object (unless you do Dirty Things).
So your call in B is simply ignored*.
*) This is specified by ?12.6.2/6, "a mem-initializer naming a virtual
base class shall be ignored during execution of the constructor of any
class that is not the most derived class."
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?