On Mon, Sep 7, 2009 at 9:21 AM, Ola Skavhaug<skavhaug@xxxxxxxxx> wrote:
We've run into problems since only GenericMatrix provides the default
argument for norm type. Swig does not like this and omits generating a
constructor for the derived types. According to
https://www.securecoding.cert.org/confluence/display/cplusplus/OBJ04-CPP.+Prefer+not+to+give+virtual+functions+default+argument+initializers
virtual function should not provide default arguments at it tends to
"defeat polymorphism":
class Thing {
public:
virtual ~Thing();
virtual void doItNTimes( int numTimes = 10 );
virtual void doItThisHigh( double howHigh = 1.0 );
// ...
};
class MyThing : public Thing {
public:
void doItNTimes( int numTimes );
void doItThisHigh( double howHigh = 2.2 );
// ...
};
MyThing *mt = new MyThing;
Thing *t = mt;
t->doItNTimes(); // default of 10
mt->doItNTimes(); // compile time error!
t->doItThisHigh(); // default of 1.0!
mt->doItThisHigh(); // default of 2.2
Is this the intended behaviour anyhow?
This is the proposed solution:
Ouch, this was another, bad solution actually :)
The proposed solution (from the link above) is roughly like this:
class Base
{
public:
void foo(double bar = 1.0) { foo_impl(bar); }
protected:
virtual void foo_impl(double bar);
};
class Sub: public Base
{
protected:
virtual void foo_impl(double bar);
};