When does final mean "maybe, kinda, sorta" ?

Andrei Alexandrescu (See Website For Email) SeeWebsiteForEmail at erdani.org
Tue Jan 23 00:15:55 PST 2007


Sean Kelly wrote:
> Andrei Alexandrescu (See Website For Email) wrote:
>> Sean Kelly wrote:
>>> Andrei Alexandrescu (See Website For Email) wrote:
>>>> kris wrote:
>>>> [snip]
>>>>> In short, it appears the example exhibits some poor practice 
>>>>> (overriding private methods), is somewhat misleading (one certainly 
>>>>> *hopes* private cannot be seen beyond module-scope), and discusses 
>>>>> how to make "final" mean something quite other than final.
>>>>
>>>> I agree about the misleading part, but I don't think that overriding 
>>>> private methods is poor practice. In fact I think it's rich practice 
>>>> :o). See e.g. http://www.gotw.ca/publications/mill18.htm.
>>>
>>> It's a good design approach, but there's no reason the virtual 
>>> methods must be private--they could be protected as well.  One could 
>>> argue that the design is cleaner with the virtual methods private, 
>>> but since the methods must be overridden by the derived class it's 
>>> not like any protection attributes are being maintained anyway.  
>>> Isn't this a current topic of discussion on comp.l.c++.m? :-)
>>
>> There is a big difference between private and protected. Private means 
>> that later-added code cannot call the method, period. It could be said 
>> that private is "distantly more private" than both protected and 
>> public because both of the latter allow access by unbounded amounts of 
>> code.
>>
>> So there is indeed something interesting by being required to 
>> implement something that you're not allowed to call. Something like 
>> Shirley Temple acting in movies she was too young to be allowed to 
>> watch :o).
> 
> But you can call it, or even change its visibility:
> 
> class Base
> {
> private:
>     virtual void fn() = 0;
> };
> 
> class Derived : Base
> {
> public:
>      virtual void fn() {}
>     void call() { fn(); }
> };
> 
> Sure, you can't call it through Base::fn(), but... :-)

Oh, my hope was that D disallows republicizing private functions :o(. 
Spectacular failure to provide a great feature...

Andrei



More information about the Digitalmars-d mailing list