Afficher un message
Vieux 22/02/2008, 20h57   #11
Alf P. Steinbach
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Is finalizing a virtual method possible in C++?

* Jeff Schwab:
> Alf P. Steinbach wrote:
>> * Kira Yamato:
>>> On 2008-02-22 07:35:34 -0500, Pavel Lepin <p.lepin@ctncorp.com> said:
>>>
>>>>
>>>> Kira Yamato <kirakun@earthlink.net> wrote in
>>>> <2008022206570016807-kirakun@earthlinknet>:
>>>>> So, I don't want to say too hestantly that it is
>>>>> impossible to simulate the finalizing of virtual methods
>>>>> and classes in C++.
>>>>>
>>>>> Hence, I rather turn to the experts and ask if anyone
>>>>> knows if it is possible to simulate them in any way?
>>>>
>>>> This is a FAQ.
>>>>
>>>> <http://www.parashift.com/c++-faq-lite/>
>>>
>>> Yes. Thanks. But the FAQ does not say that finalizing method is
>>> impossible. If in fact it did, then the answer is found. Instead,
>>> it just proposes a "solution."
>>>
>>> So let me try asking differently, has anyone gotten further with a
>>> better solution than merely stating a comment?

>>
>> There should be no reason to finalize a member function in C++.
>>
>> But if you absolutely must it's not that difficult.
>>
>> class Base
>> {
>> friend class Derived;
>> private:
>> struct OverrideTag {};
>> public:
>> virtual void foo( OverrideTag = OverrideTag() ) = 0;
>> };
>>
>> class Derived: public Base
>> {
>> public:
>> virtual void foo( OverrideTag = OverrideTag() ) {}
>> };
>>
>> class FurtherDerived: public Derived
>> {
>> public:
>> // Nix njet.
>> // virtual void foo( OverrideTag = OverrideTag() ) {}
>> };
>>
>> int main()
>> {
>> Derived o;
>> o.foo();
>> }

>
> What's to stop somebody from making OverrideTag public in the derived
> class?
>
> struct Derived: Base {
> using Base::OverrideTag;
> virtual void foo( OverrideTag = OverrideTag() ) { }
> };


Nothing. So Base just provides a service to Derived: "you can make this
function final if you want, and that's what you get by default". The
whole thing about support in Base is just because C++ doesn't have
'final', which would only appear in Derived, none of Base's business.

But I gather, if someone want's it bad enough, they can add support in
the base class...

Or introduce an artifical base class.


Cheers,

- Alf


--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
  Réponse avec citation
 
Page generated in 3,28855 seconds with 9 queries