Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承,为什么基类C++;_C++_Class_Inheritance_Constructor - Fatal编程技术网

C++ 继承,为什么基类C++;

C++ 继承,为什么基类C++;,c++,class,inheritance,constructor,C++,Class,Inheritance,Constructor,我试图在我的书中做一个作业,但我不理解输出。运行程序中的主代码时,输出为: B::B(3) B::B()//为什么要输出这个 B::B(-3) D::D(3) 它首先调用B::B(intn){},然后调用B::B(){},然后调用我得到的下两行。所以程序调用了第一个,因为它被声明为构造函数,函数中的类A,它必须赋值,我没有得到的是输出行2,为什么调用了B::B(){}?它作为构造函数被调用,但不应该只调用带有参数的构造函数吗 class B { public: B(); //why is

我试图在我的书中做一个作业,但我不理解输出。运行程序中的主代码时,输出为:

B::B(3)

B::B()//为什么要输出这个

B::B(-3)

D::D(3)

它首先调用
B::B(intn){}
,然后调用
B::B(){}
,然后调用我得到的下两行。所以程序调用了第一个,因为它被声明为构造函数,函数中的类A,它必须赋值,我没有得到的是输出行2,为什么调用了
B::B(){}
?它作为构造函数被调用,但不应该只调用带有参数的构造函数吗

class B {
public:
    B(); //why is this  called?
    B(int n);
};

// Definitions of B
B::B() { 
    cout << "B::B()\n";
}
B::B(int n) {
    cout << "B::B(" << n << ")\n";
}

class D : public B {
public:
    D();
    D(int n);
private:
    B b;
};

// Definitions of D
D::D() {
    cout << "D::D()\n";
}
D::D(int n) : B(n) {
    b = B(-n);
    cout << "D::D("<< n <<")\n";
}

int main(int argc, const char * argv[]) {
    // insert code here...

    D d(3);
    return 0;    
}
B类{
公众:
B();//为什么叫这个?
B(int n);
};
//B的定义
B::B(){

cout首先调用基类构造函数:
B::B(3)

然后调用
b
字段的构造函数:
b::b()

然后执行派生构造函数主体(在构造所有字段之后)。

D
的构造函数首先在
B=B(-n);
行上构造另一个
B
(因此打印
B::B(-3)
),然后打印
D::D(3)
首先调用基类构造函数:
B::B(3)

然后调用
b
字段的构造函数:
b::b()

然后执行派生构造函数主体(在构造所有字段之后)。

D
的构造函数首先在
B=B(-n);
行上构造另一个
B
(因此打印
B::B(-3)
),然后打印
D::D(3)
您的类
D
包含两个
B
类型的对象

  • 继承的隐式
    B
  • 名为
    B
    B的显式
    B
  • 您可以重写构造函数

    D::D(int n) : B(n)
    {
        b = B(-n);
        cout << "D::D("<< n <<")\n";
    }
    
    如果你写信

    D::D(int n) : B(n), b(-n)
    {
        cout << "D::D("<< n <<")\n";
    }
    

    针对评论:

    想象
    D
    看起来像:

    class D : public B
    {
    public:
      D(int);
    };
    
    使用构造函数定义

    D::D(int v) { std::cout << "foo with " << v; }
    
    印刷品

    B::B()
    foo with 3
    
    只要
    B
    是默认可构造的,它就完全有效

    如果
    B
    缺少默认构造函数,则会出现编译器错误,您需要将
    d
    的定义重写为

    D::D(int v) : B(3) { std::cout << "foo with " << v; }
    

    D::D(intv):B(3){std::cout您的类
    D
    包含两个
    B
    类型的对象

  • 继承的隐式
    B
  • 名为
    B
    B的显式
    B
  • 您可以重写构造函数

    D::D(int n) : B(n)
    {
        b = B(-n);
        cout << "D::D("<< n <<")\n";
    }
    
    如果你写信

    D::D(int n) : B(n), b(-n)
    {
        cout << "D::D("<< n <<")\n";
    }
    

    针对评论:

    想象
    D
    看起来像:

    class D : public B
    {
    public:
      D(int);
    };
    
    使用构造函数定义

    D::D(int v) { std::cout << "foo with " << v; }
    
    印刷品

    B::B()
    foo with 3
    
    只要
    B
    是默认可构造的,它就完全有效

    如果
    B
    缺少默认构造函数,则会出现编译器错误,您需要将
    d
    的定义重写为

    D::D(int v) : B(3) { std::cout << "foo with " << v; }
    

    D::D(intv):B(3){std::cout但是为什么要调用B字段的构造函数呢?不是B::B(3)b字段的构造函数?这是基类的构造函数。派生类隐式包含基类对象。如果只需要一个
    b
    @user2076774,则
    b
    字段是多余的。否,
    b
    字段是与基类无关的完全正常字段(除了它碰巧具有相同的类型)但是为什么调用b字段的构造函数呢?不是b::b(3)b字段的构造函数?这是基类的构造函数。派生类隐式包含基类对象。如果只需要一个
    b
    @user2076774,则
    b
    字段是多余的。否,
    b
    字段是与基类无关的完全正常字段(除了它碰巧具有相同的类型)好的,那么无论何时,只要有一个派生类调用构造函数,它是否总是必须有一个基类的构造函数?假设D::D(int n):B(n){}就是D::D(int n){}并打印出一个字符串而不是调用一个对象,因为没有包含“b”数据字段对象,会不会发生错误?因此,即使我的主代码中没有实例化b类对象,b类的默认构造函数也会运行?@user2076774:你读过我的最后一句话吗?只有在你离开成员或ba时才会调用默认构造函数se从初始值设定项列表中键入。对不起,这个概念对我来说太奇怪了。在您为编辑编写的第二个示例中,如果b是一个私有变量,尽管它在D::D(int v)中没有被调用,{std::cout@user2076774是
    b
    D::D(int v)中初始化的{std::cout好的,那么无论何时,只要有一个派生类调用构造函数,它是否总是必须有一个基类的构造函数?假设D::D(int n):B(n){}就是D::D(int n){}并打印出一个字符串而不是调用一个对象,因为没有包含“b”数据字段对象,会不会发生错误?因此,即使我的主代码中没有实例化b类对象,b类的默认构造函数也会运行?@user2076774:你读过我的最后一句话吗?只有在你离开成员或ba时才会调用默认构造函数se从初始值设定项列表中键入。对不起,这个概念对我来说太奇怪了。在您为编辑编写的第二个示例中,如果b是一个私有变量,尽管它不是在D::D(int v){std::cout@user2076774中调用的,但它是在
    D::D(int v){std::cout>中初始化的