Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   virtual base class and friend (http://www.velocityreviews.com/forums/t958152-virtual-base-class-and-friend.html)

omveer.chaudhary@gmail.com 02-28-2013 05:32 AM

virtual base class and friend
 
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 02-28-2013 07:02 AM

Re: virtual base class and friend
 
<omveer.chaudhary@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


All times are GMT. The time now is 08:51 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.