2010-12-04 50 views
10

我已经减少了我的问题到下面的示例代码:为继承的类的默认构造方法

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n); 
}; 

MewTwo::MewTwo(int n) {} 

将会产生一个错误:

no matching function for call to ‘pokemon::pokemon()’

认为的情况是,当我尝试编写不存在的MewTwo构造函数时,会调用pokemon的默认构造函数。我对C++比较陌生,所以我只是在这里猜测。有任何想法吗?

限制:修复程序无法修改或添加公共成员到类。

回答

13

其实你正在寻找的是成员初始化列表。将您的继承类构造函数更改为以下内容:

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) : pokemon(n) {} 
}; 

您在识别正在发生的事情时是正确的。基本上,当你创建继承类时,你首先创建基类,并且你不能这样做,因为没有定义默认的构造函数。成员初始化列表可帮助您解决该问题:)

查看更多示例:http://www.cprogramming.com/tutorial/initialization-lists-c++.html

+1

我从来没有听说过成员初始化列表,感谢它现在完美意义上的链接! :) – Coltin 2010-12-04 06:27:46

5

试试这个:

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) :pokemon(n){} 
}; 
+4

+1。基类和成员在派生类的构造函数代码运行之前被初始化。如果您不希望将默认构造函数用于此目的,则必须指定要使用的构造函数以及要传递的参数。如图所示,这是通过初始化列表完成的。在基类中,您定义了一个构造函数,该构造函数禁止创建默认构造函数。 – 2010-12-04 05:56:26