没有默认构造函数,无法创建基类的对象?

时间:2014-12-09 13:47:14

标签: c++ inheritance constructor

根据我的理解,如果我们指定参数化构造函数,那么编译器不会为我们创建默认构造函数,只有当我们创建没有任何参数的对象时我们才需要默认构造函数(如果我已经声明了参数化构造函数并通过传递参数创建了一个对象然后编译器不会给出错误)。我在下面的代码中做了同样的事情,我已经创建了参数化构造函数并通过传递参数但是获得错误来创建了一个对象。

#include <iostream>
using namespace std;
class Animal
{
    public :
            int var;
            Animal(int i)
            {

                    cout << "Animal Ctr " << endl;
            }
};

class Cat:public Animal
{
        public:
                Cat()
               {
                        cout << "Cat Ctr " << endl;
                }
};
int main ()
{
       Animal a(5);
       return 0;
}

上面的代码对我来说很好,如果我不继承基类但是当我继承Base类时得到以下错误

DrivedMemberwithBasePointer_forum.cc:在构造函数Cat::Cat()': DrivedMemberwithBasePointer_forum.cc:17: no matching function for call to中    动物::动物()&#39; DrivedMemberwithBasePointer_forum.cc:4:候选者是:Animal :: Animal(const    动物及安培) DrivedMemberwithBasePointer_forum.cc:8:Animal :: Animal(int)

正如我所知,当我创建基类的对象时,编译器不会调用驱动类obejct但是注入它调用的上面的代码。可以任意1请澄清我的困惑。

4 个答案:

答案 0 :(得分:3)

编译器会尝试在class Animal构造函数的成员初始化列表中调用Cat的默认构造函数,因为您没有提供任何构造函数。

你可以这样做: -

Cat() : Animal(5)

OR

要从用户获取值,您应该为class Cat设置参数化构造函数。

答案 1 :(得分:0)

您尚未创建构造函数 - 您可以执行以下操作来解决问题

Cat():Animal(5)

答案 2 :(得分:0)

在类Animal中使用参数定义构造函数时,不要生成默认构造函数。如果你想创建Cat类的对象,你可以做以下事情&#39; s:

  1. 为类Animal创建默认construcor(不带参数)或为此类Animal(int i = 0)设置构造函数参数的默认值。
  2. 使用某个值调用Cat()的初始化列表中的参数化构造函数Animal。
  3. 将Cat()更改为Cat(int值)并在初始化列表中调用Animal - Cat(int value):Animal(value)
  4. 关于你的错误: 编译器会分析您的代码,即使您不尝试在代码中创建它,也无法查看如何创建类Cat的对象。要解决此问题,请使用上面列表中的选项。

答案 3 :(得分:0)

即使没有创建Cat类的对象(因为它不是模板也不是前向声明),编译器需要有一个完整的定义(即使,当不使用类型时,它需要一个正确的定义)。

告诉编译器时CatAnimal的派生类,编译器需要知道,它应该如何创建{{1}的对象在创建Animal对象时输入。  无论你是否使用它都没关系。

由于您只有Cat类型的默认构造函数,并且未指定,Cat的对象是如何创建的,因此编译器正在查找Animal构造函数。因为它没有,所以错误。