By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,389 Members | 1,881 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,389 IT Pros & Developers. It's quick & easy.

Private Inheritance is not subtyping

P: n/a
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

--
Ragnar
Jul 19 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On 7 Nov 2003 01:31:40 -0800, Ragnar <at*******@yahoo.com> wrote:
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.

}
};

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

--
Ragnar


--
grzegorz
Jul 19 '05 #2

P: n/a
at*******@yahoo.com (Ragnar) wrote in message news:<9c**************************@posting.google. com>...
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
Jul 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.