0

当我在派生层次的类中尝试两种形式的构造函数时,结果却是不同的。谁能告诉我为什么?下面是测试代码。

//人.h

#ifndef PERSON_H_
#define PERSON_H_
#include<string>

using std::string;

class Person{
    private:
        string firstname;
        string lastname;
    public:
        Person(const char *fn="NoName", const char *ln="NoName");   //A
        Person(const string &fn, const string &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

//PersonDefinition.cpp

#include"Person.h"
#include<iostream>
#include<cstdlib>

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 &fn,const string &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){

}

//PersonTest.cpp

#include<iostream>
#include "Person.h"

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

}

所以,这就是问题所在。上面的程序无法使用所有参数的默认值的默认构造函数进行编译,并抛出一条错误消息,指出“在 '!' 之前需要 ',' 或 '...' 令牌”,但是如果我将 A、B、C、D 行中的默认构造函数替换为不带参数的形式,则程序编译并成功运行。有人能告诉我为什么吗?下面是错误信息。

错误信息

4

1 回答 1

1

您没有实现所有构造函数。例如,您声明了一个构造函数PokerPlayer::PokerPlayer(char*, char*),但您正试图创建一个 PokerPlayer PokerPlayer b("Johnson","William",8);(即您从未声明一个接受第三个参数的构造函数)。您希望上一行工作的声明是PokerPlayer::PokerPlayer(char*, char*, int);

此外,在尝试声明 a 时,您会遇到完全相反的问题GunSlinger。您的 GunSlinger 类需要第三个参数,而您试图在没有该参数的情况下声明它。

即使您的基类支持多种类型的构造函数,每个派生类也必须明确声明/实现您希望在其上使用的每个构造函数(默认构造函数除外)。

编辑

这是一些半功能代码:

class PokerPlayer : public Person
{
  ...
  PokerPlayer(char* fname, char* lname, int val);
  ...
};

执行

PokerPlayer::PokerPlayer(char* fname, char* lname, int val) : Person(fname, lname, val)
{
  // Anything else we should do...
}
于 2012-04-26T15:22:50.747 回答