Is it standard that inner class inherits the outer class' friendship?

Q

Qi

Below code, indeed I found here,
http://bytes.com/topic/c/answers/523273-inner-classes-friend
I changed it a bit to make it compilable and simpler.

The code can be compiled on both VC 2008 Express and GCC 4.5.2

That implies that
"An inner class can inherit its outer class' friendship".
My question is if that implication correct?

I doubt that because,
1, The link I showed above seems approved that's wrong.
Though that was posted in 2006.
2, As far as I understand, a derived class doesn't inherit
its base class' friendship. B is F's friend, D is derived from
B, D is not F's friend by default. (am I correct?)

Can any one give some summary on the friendship inheritance
of inner and outer classes, base and derived classes that defined
by the standard?

Thanks


===CODE===

class Node {
private:
int value;

friend class Graph;
};

class Graph {
private:
class cmp {
public:
int operator()(const Node &l, const Node &r) {
return (l.value - r.value); // without that friend, this
line can't compile
}
};
};
 
S

Saeed Amrollahi

Below code, indeed I found here,http://bytes.com/topic/c/answers/523273-inner-classes-friend
I changed it a bit to make it compilable and simpler.

The code can be compiled on both VC 2008 Express and GCC 4.5.2

That implies that
"An inner class can inherit its outer class' friendship".
My question is if that implication correct?

I doubt that because,
1, The link I showed above seems approved that's wrong.
Though that was posted in 2006.
2, As far as I understand, a derived class doesn't inherit
its base class' friendship. B is F's friend, D is derived from
B, D is not F's friend by default. (am I correct?)

Can any one give some summary on the friendship inheritance
of inner and outer classes, base and derived classes that defined
by the standard?

Thanks

===CODE===

class Node {
private:
     int value;

     friend class Graph;

};

class Graph {
private:
     class cmp {
     public:
         int operator()(const Node &l, const Node &r) {
             return (l.value - r.value); // without that friend, this
line can't compile
         }
     };

};

Hello
1. At first, I have to say the terms "inner class" and "outer class"
aren't standard. It's somehow Java terms. C++ uses "nested class".
2. About your code, By the term "inner class", if you mean "nested
class",
you didn't use it. You have two classes: Node and Graph and you
declared
Graph as a friend of Node. May be, by inner you mean the logical
inner,
because each node of a graph is somehow the inner part of whole graph.
3. Yes. You are right. friendship isn't inherited, transitive, or
reciprocal.
Please see the following link:
http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4
Also for standard wording, see section 11.3 of
N3290- Final Draft of International Standard.

HTH,
-- Saeed Amrollahi
 
Q

Qi

1. At first, I have to say the terms "inner class" and "outer class"
aren't standard. It's somehow Java terms. C++ uses "nested class".
2. About your code, By the term "inner class", if you mean "nested
class",
you didn't use it. You have two classes: Node and Graph and you
declared
Graph as a friend of Node. May be, by inner you mean the logical
inner,
because each node of a graph is somehow the inner part of whole graph.


Thanks for the reply and sorry for the misunderstand.
For nested class (OK, now I will use this term, but then what's the
equivalence of "outer class"?), I mean Graph::cmp.

Sorry for any misunderstand.
 
S

Saeed Amrollahi

Thanks for the reply and sorry for the misunderstand.
For nested class (OK, now I will use this term, but then what's the
equivalence of "outer class"?), I mean Graph::cmp.

Sorry for any misunderstand.

Hi
I'm sorry too, because, I didn't pay attention to
nested class Graph::cmp.
As I mentioned in section 11.3 at paragraph 2, there is wording:
"Declaring a class to be a friend implies that the names of
private and protected members from the class granting friendship
can be accessed in the base-specifiers and member declarations of
the befriended class."
In your case:
If you declare class Graph a friend of class Node, the private
names of class Node (the class granting friendship) can be accessed
in nested class cmp of the befriending class (Graph).

BTW, I can't find a standard terminology for "Outer class",
but in standard document, there is an example using "enclose" as
class name.

HTH,
-- Saeed Amrollahi
 
Q

Qi

As I mentioned in section 11.3 at paragraph 2, there is wording:
"Declaring a class to be a friend implies that the names of
private and protected members from the class granting friendship
can be accessed in the base-specifiers and member declarations of
the befriended class."
In your case:
If you declare class Graph a friend of class Node, the private
names of class Node (the class granting friendship) can be accessed
in nested class cmp of the befriending class (Graph).

Thanks, that explained my problem.
 

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,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top