C++ linkage specifics WRT virtual vs non-virtual member functions
via Digitalmars-d
digitalmars-d at puremagic.com
Sun Aug 13 00:42:15 PDT 2017
On Sunday, 13 August 2017 at 07:18:31 UTC, Roman Hargrave wrote:
> I'm writing some bindings and have run in to a dilemma due to
> the lack of explicit information on how the D compiler
> "decides" to use virtual dispatch for a member function or not.
>
> Specifically, I have a C++ library that _explicitly_ marks some
> member functions as virtual, in addition to a plethora of
> non-virtual functions.
>
> I would like to be certain that the D compiler understands that
> I would like it to treat those functions as virtual functions,
> but unlike C++ where there is a `virtual` classifier for
> functions, D does not appear to have such a facility.
>
> The C++ interop documentation suggests that both non- and
> virtual functions are supported, but further suggests that it
> only treats inherited functions as virtual with no method of
> explicitly requesting virtual dispatch for that method.
>
> As far as I can tell, all specified member functions in a class
> with C++ linkage are assumed to be non-virtual unless they are
> overriden?
W.r.t. virtual member functions, D's syntax is more similar to
Java than to C++, in that class member functions are virtual by
default, unless marked as `final`.
So to declare the following C++ class:
class Base
{
virtual int fun();
int gun();
};
In D you have to do the following:
extern (C++) class Base
{
int fun();
final int gun();
}
Like all other attributes, you can group multiple members to
which you want to apply the `final` attribute by either:
class C
{
final
{
int gun();
int hun();
}
}
Or:
class C
{
final:
int gun();
int hun();
}
Though be aware that unlike the protection attributes (public,
private), there's no way to undo 'final:', so if you use it, you
would have to move it with all the non-virtual methods to the
bottom of the class definition.
More information about the Digitalmars-d
mailing list