Why is a pure virtual function initialized by 0?
Asked Answered
T

11

169

We always declare a pure virtual function as:

virtual void fun () = 0 ;

I.e., it is always assigned to 0.

What I understand is that this is to initialize the vtable entry for this function to NULL and any other value here results in a compile time error. Is this understanding correct or not?

Trug answered 28/1, 2010 at 17:48 Comment(3)
Note that vtable is not a language requirement, but just an implementation option for virtual methods. A compiler could create the same abstraction with a different implementation (that is, without vtable, and without any element there being 0)Airdry
@hype Re your supplementary question - that's what my answer (and several others) says.Mither
Just curious, what happens if i give, virtual void func() = 100;Preinstruct
M
178

The reason =0 is used is that Bjarne Stroustrup didn't think he could get another keyword, such as "pure" past the C++ community at the time the feature was being implemented. This is described in his book, The Design & Evolution of C++, section 13.2.3:

The curious =0 syntax was chosen ... because at the time I saw no chance of getting a new keyword accepted.

He also states explicitly that this need not set the vtable entry to NULL, and that doing so is not the best way of implementing pure virtual functions.

Mither answered 28/1, 2010 at 17:54 Comment(10)
So this is just a syntax with no specific reason selecting 0 as the value? It could have well been some other value or keyword as wellTrug
Yep, it's just syntax. I've seen a lot of projects that #define PURE =0 and they'll say virtual void Foo() PURE;Merrile
Please God keep me away from those projects :-)Mither
Its a lot less worse than #define BEGIN { #define END } ;-) and I have seen that sometimes.Decrepitude
@Gamecat probably Pascal programmers who couldn't adapt.Sell
This kind of nifty thing makes me think C++ is not very polished. It's weird considering it's so much used. I hope the language will be better with the days passing.Beachlamar
So, in other words, Bjarne was "faced with a deadline" and "used a hack" to get past a "design flaw" ;) (Just being facetious)Feverous
I always forget this kind of syntax.Persinger
this is why I like golangCahoon
@Beachlamar maybe in the standard after the next standard or the standard after that. So in ~2030 we will likely have a 'pure' or 'abstract' keyword :)Allusive
L
87

As with most "Why" questions about the design of C++, the first place to look is The Design and Evolution of C++, by Bjarne Stroustrup1:

The curious =0 syntax was chosen over the obvious alternative of introducing a new keyword pure or abstract because at the time I saw no chance of getting a new keyword accepted. Had I suggested pure, Release 2.0 would have shipped without abstract classes. Given a choice between a nicer syntax and abstract classes, I chose abstract classes. Rather than risking delay and incurring the certain fights over pure, I used the tradition C and C++ convention of using 0 to represent "not there." The =0 syntax fits with my view that a function body is the initializer for a function also with the (simplistic, but usually adequate) view of the set of virtual functions being implemented as a vector of function pointers. [ ... ]

1§13.2.3 Syntax

Lockwood answered 28/1, 2010 at 18:2 Comment(0)
N
33

Section 9.2 of the C++ standard gives the syntax for class members. It includes this production:

pure-specifier:
    = 0

There is nothing special about the value. "= 0" is just the syntax for saying "this function is pure virtual." It has nothing to do with initialization or null pointers or the numeric value zero, although the similarity to those things may have mnemonic value.

Nonjoinder answered 28/1, 2010 at 17:57 Comment(3)
+1 for referring to the C++ Standard. It's a kind of surprising that one of best possible answer and got only 1 vote so far. Reading the standard should be the very first step in order to solve C++ questions.Presbytery
@mloskot: maybe because it doesn't answer the OP's question, just restates the situation?Troika
@just somebody - It includes the standard citation which states what's the syntax of pure virtual function declaration and that the syntax uses pure-specifier = 0 What else would you like to know? It would be the same as asking why function body is wrapped with {} The answer would be, because that's what C++ syntax defines.Presbytery
T
17

I'm not sure if there is any meaning behind this. It is just the syntax of the language.

Telemann answered 28/1, 2010 at 17:52 Comment(0)
R
17

C++ has always shied away from introducing new keywords, since new reserved words break old programs which use these words for identifiers. It's often seen as one of the language's strengths that it respects old code as far as possible.

The = 0 syntax might indeed have been chosen since it resembles setting a vtable entry to 0, but this is purely symbolic. (Most compilers assign such vtable entries to a stub which emits an error before aborting the program.) The syntax was mainly chosen because it wasn't used for anything before and it saved introducing a new keyword.

Raab answered 28/1, 2010 at 17:57 Comment(7)
+1 for explaining the disadvantage of introducing a new keyword. That's helpful to understand the rationale, but C++ syntax seems absurdly convoluted to me and I wish they would have made it more human-readable--a pure keyword would have been great in my book. Anyway, it's good to understand the rationale.Isia
@KeithPinson If you want a pure keyword, you can #define pure = 0.Writhen
@jdh8: Ugh. Just... Ugh.Raab
As a side note, in a class with Bjarne he said he really wanted to get the "pure" keyword into C++... but he tried to get it in very late in the cycle before the C++ compiler was going to be shipped (IIRC less than two weeks). Ostensibly, it didn't make it in.Laroy
@ThePhD: ISTR he also says this somewhere in D&E. (I'm too lazy to look it up, though.)Raab
@Raab Jerry Coffin's answer quotes thisDolliedolloff
@milleniumbug: Oh. :-)Raab
A
11

C++ must have a way to distinguish a pure virtual function from a declaration of a normal virtual function. They chose to use the = 0 syntax. They could just have easily done the same by adding a pure keyword. But C++ is pretty loath to add new keywords and prefers to use other mechanisms to introduce features.

Aneroid answered 28/1, 2010 at 17:52 Comment(1)
-0: when you have nothing substantial to say on your own, use an extensive quote (see Jerry Coffin's answer for +1 ;)Troika
R
7

Nothing is "initilaized" or "assigned" zero in this case. = 0 in just a syntactical construct consisting of = and 0 tokens, which has absolutely no relation to either initialization or assignment.

It has no relation to any actual value in "vtable". The C++ language has no notion of "vtable" or anythng like that. Various "vtables" are nothing more than just details of specific implementations.

Roup answered 28/1, 2010 at 17:54 Comment(0)
M
3

I remember reading that the justification for the funny syntax was that it was easier (in terms of standards-acceptance) than introducing another keyword that would do the same thing.

I believe this was mentioned in The Design and Evolution of C++ by Bjarne Stroustrup.

Miamiami answered 28/1, 2010 at 17:54 Comment(0)
T
2

I would assume that this is just part of the C++ grammar. I don't think there are any restrictions to how the compilers actually implement this for a given specific binary format. You're assumption probably was right for the early day C++ compilers.

Theater answered 28/1, 2010 at 17:52 Comment(0)
B
2

The = 0declares a pure virtual function.

What is understand is that this is to initialize the vtable entry for this function to NULL and any other value here results in compile time error

I don't think that's true. It's just special syntax. The vtable is implementation-defined. No one says a vtable entry for a pure member must be actually zeroed upon construction (although most compilers handle vtables similar).

Bonine answered 28/1, 2010 at 17:55 Comment(3)
That's actually not true. There's nothing wrong with providing a definition for a pure virtual function. The only thing = 0 does is makes the entire class abstract and prohibits virtual calls to pure functions. Non-virtual calls are still perfcectly OK, which is when the definition (if you provided one) is used.Roup
Just look at the godbolt output. There isn't room for ambiguity or speculation. I'll take a look myself laterBini
It seems that it replaces the entry with __cxa_pure_virtual arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… instead of Base::f()Bini
A
1

Well, you can also initialize the vtable entry to point to an actual function"

 virtual void fun()
 {
     //dostuff()
 }

Seems intuitive that the vtable entry can either be defined to point nowhere (0) or to a function. Letting you specify your own value for it would probably result in it pointing to garbage instead of to a function. But that is why "= 0" is allowed and "= 1" is not. I suspect Neil Butterworth is right about why "= 0" is used at all

Alexiaalexin answered 28/1, 2010 at 17:56 Comment(1)
Even i had similar opinion but since many have quoted standards and Bjarne's comments on the same, we have minimal chances of argument :)Trug

© 2022 - 2024 — McMap. All rights reserved.