Private Inheritance is not subtyping

R

Ragnar

Hello

If there a derived class privately inheriting from a base class, there
is no subtyping relationship between them. So a funtion that expects a
base class pointer should not accept a derived class pointer.

However, if this same function is called from within a derived class
function, passing 'this', then the function accepts it. Why is that. I
enclose some test code:

#include <iostream>

using std::cout;

class Base {
friend class FriendClass;
private:
virtual void print() const { cout << "In Base\n"; }
};

class FriendClass {
public:
void print(Base * pb) { pb->print(); }
};

class Derived : private Base { // note private
void print() const { cout << "In Derived 2\n"; }
public:
void printEx(FriendClass & rf, Derived * pd) {
rf.print(pd); // why does this work ?
rf.print(this); // why does this work ?
}
};

int main()
{
FriendClass of;
Derived od;
//Base * pb = new Derived; // will not work, base inaccessible
//of.print(&od); // does not work
od.printEx(of, &od); // works

return 0;
}

Here, if print is called from main, being passed &od, it does not
compile. If print is called from printEx, being passed this, it
compiles. Why ?

I used g++ 3.2.

Regards & Thanks
 
G

Grzegorz Sakrejda

Hello

If there a derived class privately inheriting from a base class, there
is no subtyping relationship between them. So a funtion that expects a
base class pointer should not accept a derived class pointer.

However, if this same function is called from within a derived class
function, passing 'this', then the function accepts it. Why is that. I
enclose some test code:

#include <iostream>

using std::cout;

class Base {
friend class FriendClass;
private:
virtual void print() const { cout << "In Base\n"; }
};

class FriendClass {
public:
void print(Base * pb) { pb->print(); }
};

class Derived : private Base { // note private
void print() const { cout << "In Derived 2\n"; }
public:
void printEx(FriendClass & rf, Derived * pd) {
rf.print(pd); // why does this work ?
rf.print(this); // why does this work ?

conversion Derived* -> Base* is private in Derived, will not be inherited
but exist in Derived.
Function print in FriendClass calls print through the pointer to Base,
that is Derived::print will be called.
 
D

Dan Cernat

Hello

If there a derived class privately inheriting from a base class, there
is no subtyping relationship between them. So a funtion that expects a
base class pointer should not accept a derived class pointer.

However, if this same function is called from within a derived class
function, passing 'this', then the function accepts it. Why is that. I
enclose some test code:

see in code
#include <iostream>

using std::cout;

class Base {
friend class FriendClass;
private:
virtual void print() const { cout << "In Base\n"; }
};

class FriendClass {
public:
void print(Base * pb) { pb->print(); }
};

class Derived : private Base { // note private
void print() const { cout << "In Derived 2\n"; }
public:
void printEx(FriendClass & rf, Derived * pd) {
rf.print(pd); // why does this work ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pd is Derived* so it calls the Derived::print
rf.print(this); // why does this work ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is Derived* so it calls the Derived::print
}
};

int main()
{
FriendClass of;
Derived od;
//Base * pb = new Derived; // will not work, base inaccessible
//of.print(&od); // does not work
od.printEx(of, &od); // works

return 0;
}

Here, if print is called from main, being passed &od, it does not
compile. If print is called from printEx, being passed this, it
compiles. Why ?

the output of the program is:

In Derived 2
In Derived 2

I used g++ 3.2.

Regards & Thanks

It does what is supposed to do. Check again your code.

/dan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top