On 9 Jun 2011, at 00:10, Nilay Vaish wrote: > On Wed, 8 Jun 2011, Jack Harvard wrote: > >> >> On 8 Jun 2011, at 23:28, Nilay Vaish wrote: >> >>> On Wed, 8 Jun 2011, Jack Harvard wrote: >>> >>>> >>>> >>>> On 8 Jun 2011, at 19:09, Nilay Vaish wrote: >>>> >>>>> On Wed, 8 Jun 2011, Jack Harvard wrote: >>>>> >>>>>> When you declare your function private, you can't use >>>>>> instance.function() to access it. Is it generating a compile time error? >>>>>> >>>>>> On 8 Jun 2011, at 00:31, Nilay Vaish wrote: >>>>>> >>>>>>> Consider the following class declarations -- >>>>>>> >>>>>>> class A >>>>>>> { >>>>>>> public: >>>>>>> virtual void function() = 0; >>>>>>> }; >>>>>>> >>>>>>> class B : public A >>>>>>> { >>>>>>> private: >>>>>>> void function(); >>>>>>> } >>>>>>> >>>>>>> int main() >>>>>>> { >>>>>>> B b; >>>>>>> b.function(); >>>>>>> } >>>>>>> >>>>>>> Will this code compile correctly? >>>>>>> >>>>>>> -- >>>>>>> Nilay >>>>> >>>>> I should say that my example program was not what I intended it to be. >>>>> The main function should look like -- >>>>> >>>>> int main() >>>>> { >>>>> B* b = new B(); >>>>> A* a = b; >>>>> a->function(); >>>>> return 0; >>>>> } >>>>> >>>>> Now what would happen? >>>> >>>> This compiles. However, if you do b->function(), you would get the same >>>> error as your last example, due to the same reason. >>>> >>> >>> It compiles and executes fine. What surprises me is that even though >>> function() is private for class B, still it gets invoked using the pointer >>> from class A. I was not aware of this before. >> >> Overriding and access visibility is orthogonal, you use class A pointer to >> access its public function. > > I won't term this is a overriding, the function that will be called would be > the one defined in class B, as 'function()' is a virtual member of class A. > But then, 'function()' is private to class B, so I would expect some error to > occur. I think the reason is that visibility is tested only at compile time > and never at run time.
It's still overriding for the function() defined in B which is overriding the function defined in base class A (whether it's defined as virtual or pure virtual). In C++ it's allowed to override with a private member. That means you can only call it via a pointer or reference to the base. This is occasionally useful (eg if the base is a private one), but it isn't very common in my experience. (A long, long time ago there were rules in C++ like those in Java to prevent derived classes reducing the visibility of members. They were abandoned because they got in the way of reasonable code.) _______________________________________________ gem5-dev mailing list gem5-dev@m5sim.org http://m5sim.org/mailman/listinfo/gem5-dev