【问题标题】:Unable to create object of base clas without default constructor?无法在没有默认构造函数的情况下创建基类对象?
【发布时间】:2014-12-09 13:47:14
【问题描述】:

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

#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;
}

如果我不继承基类但在我继承基类时遇到错误,上面的代码对我来说可以正常工作

DrivedMemberwithBasePointer_forum.cc:在构造函数Cat::Cat()': DrivedMemberwithBasePointer_forum.cc:17: no matching function for call to 动物::动物()' DrivedMemberwithBasePointer_forum.cc:4:候选人是:Animal::Animal(const 动物&) DrivedMemberwithBasePointer_forum.cc:8: Animal::Animal(int)

据我所知,当我创建基类的对象时,编译器不会调用驱动类对象,但会在上面调用它的代码。 ., 请任何人澄清我的困惑。

【问题讨论】:

    标签: c++ inheritance constructor


    【解决方案1】:

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

    你可以这样做:-

    Cat() : Animal(5)
    

    为了从用户那里获取价值,你应该有 class Cat 的参数化构造函数。

    【讨论】:

    • 这个解决方案在我心中产生了非常基本的疑问,即我没有创建驱动类的对象,那么为什么编译器会尝试调用驱动类构造函数?
    • 要构造一只猫,你需要构造一只动物。派生类和基类总是如此。 Derived 类的每个对象都有一个 Base 类的对象。
    • @zoska 是的,要构造一只猫,我需要构造一只动物,这很好,但是在我的代码中,我试图构造“仅”动物,那么为什么我的编译器正在研究 Cat 构造函数?另外,您能否就“Oleksandr Mykolaichyk”回复的最后一句发表您的看法。
    • @SHAHIDNX 看我的回答
    【解决方案2】:

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

    Cat():Animal(5)
    

    【讨论】:

    • 这个解决方案在我心中产生了非常基本的疑问,即我没有创建驱动类的对象,那么为什么编译器会尝试调用驱动类构造函数?
    【解决方案3】:

    当您在类 Animal 中定义带参数的构造函数时,编译器不会生成默认构造函数。如果要创建 Cat 类的对象,可以执行以下操作:

    1. 为类 Animal 创建默认构造函数(不带参数)或为构造函数的参数设置默认值,例如此 Animal(int i=0)。
    2. 在 Cat() 的初始化列表中调用参数化构造函数 Animal 并使用一些值。
    3. 将 Cat() 更改为 Cat(int value) 并在初始化列表中调用 Animal - Cat(int value):Animal(value)

    关于你的错误: 编译器会分析您的代码,即使您不尝试在代码中创建它,也看不到如何创建 Cat 类的对象。要解决此问题,请使用上面列表中的选项。

    【讨论】:

      【解决方案4】:

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

      当告诉编译器CatAnimal的派生类时,编译器需要知道,在创建@时应该如何创建Animal类型的对象987654324@ 对象。 用不用都没关系。

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

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        相关资源
        最近更新 更多