假设我有:

class Human {
    string choice;
public:
    Human(string);
};

class Computer {
    string compChoice;
public:
    Computer(string);
};

class Refree : public Human, public Computer {
public:
    string FindWinner();
};

int main() {
    Human* H1 = new Human("name");
    Computer* C1 = new Computer("AI");
    Refree* R1 = new Refree();
}

此代码无法使用以下代码进行编译:
 In function 'int main()':
error: use of deleted function 'Refree::Refree()'
note: 'Refree::Refree()' is implicitly deleted because the default definition  would be ill-formed:
error: no matching function for call to 'Human::Human()'
note: candidates are:
note: Human::Human(std::string)
note:   candidate expects 1 argument, 0 provided

为什么会失败,如何构造指向Refree的指针?

最佳答案

由于HumanComputer具有用户声明的带有参数的构造函数,因此会默认删除其默认构造函数。为了构造它们,您需要给它们一个参数。

但是,您正在尝试构造不带任何参数的Refree-隐式地尝试构造不带任何参数的所有基数。那是不可能的。抛开是否同时将HumanComputer有意义,至少必须执行以下操作:

Refree()
: Human("human name")
, Computer("computer name")
{ }

您更可能希望提供一个使用一个或两个名称的构造函数,例如:
Refree(const std::string& human, const std::string& computer)
: Human(human)
, Computer(computer)
{ }

10-05 23:49