[Development] final value classes: some background information and plans

Marc Mutz marc.mutz at kdab.com
Wed Mar 7 14:25:08 CET 2012


On Wednesday March 7 2012, Jedrzej Nowacki wrote:
> What are you trying to solve?

I'm trying to prevent that people with a Java mind from running into the C++ 
trap that inheriting from a base class with a public non-virtual destructor 
may invoke undefined behaviour. Looking at the number of "add virtual 
destructor" commits, and dividing that by the number of new polymorphic 
classes added, even we ourselves aren't doing too well.

Andre said "Qt is meant to be useful". That's true, but it's also meant to be 
safer than raw C++. But if Qt class design doesn't even follow the basic 
guidelines of C++ class design (as laid out in e.g. Sutter/Alexandrescu), 
then how can it hope to be safer?

You shouldn't look at the Qt-project developers when discussing interfaces. 
You should look a the Qt programmers in the trenches that happily write 
QColor * c = new QColor(...), as blissfully ignorant of the resource leak as 
they are of Sutter/Alexandrescu. So, Qt can either default to safety or it 
can default to the sharp edge. If you think the latter is acceptable, I urge 
you to run a Qt Open Enrollment training as an eye-opener. Hell, I inherited 
QPtrList publicly when I started out, and I would have been glad if the 
compiler told me I shouldn't do that.

> Using raw pointers may be unsafe but it 
> doesn't mean that the functionality should be removed from C++. I agree
> with Andre blocking inheritance is really radical move, that doesn't buy us
> much apart of SC problems.

This is not meant to silence compiler warnings. This is meant to make Qt safer 
to use. It only triggers on code that deserves to be broken. As is adding 
explicit to ctors, as is disabling implicit conversion from QByteArray to 
const char*.

Unlike the Qt3->4 SiC changes, this doesn't aim to break some of the most 
fundamental idioms in Qt (e.g. "you pass object names to the constructor"), 
so comparing this change to the Qt4 SiCs, as someone on #qt-labs did, is a 
gross exaggeration, IMO.

That said, I agree that breaking lots of code is undesirable. That's why for 
the containers I proposed to make a safe-as-baseclass version available 
(QBasicContainer), so existing designs can be ported with minimal effort, if 
they need to be ported at all (they could just define Q_DECL_FINAL_CLASS 
away). But I don't see the need to do this for all value classes.

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
www.kdab.com || Germany +49-30-521325470 || Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-Independent Software Solutions



More information about the Development mailing list