C++ 继承,为什么基类C++;
我试图在我的书中做一个作业,但我不理解输出。运行程序中的主代码时,输出为: B::B(3) B::B()//为什么要输出这个 B::B(-3) D::D(3) 它首先调用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(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>中初始化的