假设我有:
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
的指针? 最佳答案
由于Human
和Computer
具有用户声明的带有参数的构造函数,因此会默认删除其默认构造函数。为了构造它们,您需要给它们一个参数。
但是,您正在尝试构造不带任何参数的Refree
-隐式地尝试构造不带任何参数的所有基数。那是不可能的。抛开是否同时将Human
和Computer
有意义,至少必须执行以下操作:
Refree()
: Human("human name")
, Computer("computer name")
{ }
您更可能希望提供一个使用一个或两个名称的构造函数,例如:
Refree(const std::string& human, const std::string& computer)
: Human(human)
, Computer(computer)
{ }