Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

virtual base class and friend

20 views
Skip to first unread message

omveer.c...@gmail.com

unread,
Feb 28, 2013, 12:32:23 AM2/28/13
to
Hi,

I'm trying below scenario:
class xx
{
xx(){}
friend class yy;
};

class yy: virtual public xx
{
public:
yy(){}
};

class zz:public yy
{
public:
};

Q1: It doesn't work with ZZ obj; Please help me understanding it.

class xx
{
xx(){}
friend class yy;
};

class yy: public xx
{
public:
yy(){}
};

class zz:public yy
{
public:
};

Q2: After removing virtual, it works for zz obj;. Why and how?

Thanks in advance.

Regards

Tobias Müller

unread,
Feb 28, 2013, 2:02:16 AM2/28/13
to
<omveer.c...@gmail.com> wrote:
> Hi,
>
> I'm trying below scenario:
> class xx
> {
> xx(){}
> friend class yy;
> };
>
> class yy: virtual public xx
> {
> public:
> yy(){}
> };
>
> class zz:public yy
> {
> public:
> };
>
> Q1: It doesn't work with ZZ obj; Please help me understanding it.

Your class zz implicitly has the following constructor:

class zz : public yy
{
public:
zz() : xx(), yy() {}
}

Constuctors of virtual base classes are called from every derived class
directly.

Consider the following case:

class A
{
public:
A();
A(int i);
};

class B : virtual public A
{
public:
B() : A() {}
};

class C : virtual public A
{
public:
C() : A(4) {}
};

class D : public B, public C
{
public:
// D() : B(), C() {} // -> Error, the A subobject
// is the same for B and C
// and can only be
// constructed once. But use
// A() or A(4)?
D() : A(), B(), C() {} // Correct
};

> class xx
> {
> xx(){}
> friend class yy;
> };
>
> class yy: public xx
> {
> public:
> yy(){}
> };
>
> class zz:public yy
> {
> public:
> };
>
> Q2: After removing virtual, it works for zz obj;. Why and how?
Your class zz implicitly has the following constructor:

class zz : public yy
{
public:
zz() : yy() {}
}

Constuctors of non-virtual base are only called from classes that inherit
directly.

Consider again the same case, but without virtual inheritance:

class A
{
public:
A();
A(int i);
};

class B : public A
{
public:
B() : A() {}
};

class C : public A
{
public:
C() : A(4) {}
};

class D : public B, public C
{
public:
D() : B(), C() {} // Correct: B and C have both
// their own A object and
// do the initialization on their own.
// D() : A(), B(), C() {} // Error
};

Tobi
0 new messages