D pointers #2
Thiago Macieira
thiago at kde.org
Thu Oct 20 19:10:53 BST 2005
Luís Pedro Coelho wrote:
>On Thursday 20 October 2005 06:27, Thiago Macieira wrote:
>> Right. But the point is: people expect it to output C, C, C, because
>> it's the virtual function "virt" that is called. I remember a certain
>> job interview asking exactly that, recently :-)
>
>BTW, Java does that. On the one hand, it can be said to be the expected
>behaviour, on the other hand if C::virt() uses a member object, it could
> be messy (undefined behaviour, ie crashes). C++ always chooses "do the
> correct thing even if its ugly and unexpected and not at all intuitive
> and the wrong behaviour only happens in very special circumstances".
After being asked what would happen in that interview, I was asked why C++
chose to do it that way.
My answer was: because of multiple inheritance.
If you think a bit, you'll see that C++ could do the RightThing™ and still
call virtuals through the virtual table from inside constructors if it
were not for MI. The constructor flow is like this:
1) call parents' constructors
2) initialise variables
3) run code
If you exchanged 1 and 2, you'd arrive at the base class with all
variables initialised by the time the first line of code were executed.
But only for single inheritance. For it to work in MI, you'd need to call
all parents' variable initialisation and only then start code exection.
Illustration:
class C: public A, public B
You'd need to initialise all of A's member variables, then B's and only
then run A's code.
Also note that, even with the RightThing™ C++ you can still manage to do
WrongThings. Running the following program will produce junk in the
output:
#include <iostream>
using namespace std;
class MyClass
{
class Private;
Private * const d;
public:
int m_variable;
MyClass();
};
class MyClass::Private
{
MyClass * const q;
public:
Private(MyClass* parent)
: q(parent)
{
cout << q->m_variable << endl;
}
};
MyClass::MyClass()
: d(new Private(this)), m_variable(0)
{ }
main()
{
MyClass c;
}
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
PGP/GPG: 0x6EF45358; fingerprint:
E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
5. Swa he géanhwearf tó timbran, and hwonne he cóm, lá! Unix cwæð "Hello,
World". Ǽfre ǽghwilc wæs glæd and seo woruld wæs fréo.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20051020/face75d8/attachment.sig>
More information about the kde-core-devel
mailing list