Are the two forms of default class constructor equivalent?
<p>When I try the two forms of constructor in classes of derivation hierarchy, the result turns out to be different. Could anybody tell me why? Below are the test code.</p>

<p>//Person.h</p>

<pre><code>#ifndef PERSON_H_
#define PERSON_H_
#include&lt;string&gt;

using std::string;

class Person{
    private:
        string firstname;
        string lastname;
    public:
        Person(const char *fn="NoName", const char *ln="NoName");   //A
        Person(const string &amp;fn, const string &amp;ln);
        virtual ~Person(){}

};

class Gunslinger:virtual public Person{
    private:
        int notchnum;       
    public:
        Gunslinger(const char*f="unknown",const char*n="unknown",int not=0);//B
        virtual ~Gunslinger(){}
};

class PokerPlayer:virtual public Person{

    public:
        PokerPlayer(const char*fn="unknown", const char*ln="unknown");//C;
        virtual ~PokerPlayer(){}
};    

class BadDude:public Gunslinger,public PokerPlayer{
    public:
        BadDude(const char*fn="unknown", const char*ln="unknown", int notc=0);//D

};

#endif
</code></pre>

<p>//PersonDefinition.cpp</p>

<pre><code>#include"Person.h"
#include&lt;iostream&gt;
#include&lt;cstdlib&gt;

using std::cout;
using std::endl;
using std::cin;

Person::Person(const char*fn, const char*ln):firstname(fn),lastname(ln){
}

Person::Person(const string &amp;fn,const string &amp;ln):firstname(fn),lastname(ln){

}

Gunslinger::Gunslinger(const char*fn,const char*ln, int not):Person(fn,ln),notchnum(not){
}

PokerPlayer::PokerPlayer(const char*fn,const char*ln):Person(fn,ln){
}

BadDude::BadDude(const char*fn, const char*ln, int notc):Person(fn,ln),PokerPlayer(fn, ln),Gunslinger(fn,ln,notc){

}
</code></pre>

<p>//PersonTest.cpp</p>

<pre><code>#include&lt;iostream&gt;
#include "Person.h"

int main(){
    Person a("Jack","Husain");
    PokerPlayer b("Johnson","William",8);
    Gunslinger c("Mensly","Sim");

}
</code></pre>

<p>So, here is the problem. The program above fails to compile with the default constructor with default value for all argument and throws an error message saying that "expected ',' or '...' before '!' token", but if I replace the default constructor in Line A,B,C,D with the form without argument, the program compiles and run successfully.Could anyone tell me why? Below is the error message.</p>

<p><img src="http://i.stack.imgur.com/f9RBN.png" alt="error message"></p>
