-1
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    A() { i=1; j=2;};
    A (A &obj) { i= obj.i+100; j= obj.j+100;};
     int i;
     int j;
};

class B:public A
{
public:
    B():A() {i=10; j=20; k=30;};

    B(A &obj) {  A::A(obj); k=10000; };//

    int k;
};

int main()
{ 
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;

    return 0;
}

我尝试为派生类编写一个复制构造函数,以利用基类的复制构造函数。我预计mouse.i应该是 101,但实际上编译结果是 1。 的值mouse.k是 10000,这是预期的。我想知道我的代码有什么问题。

4

4 回答 4

5

您必须使用初始化列表来调用父级的构造函数(您也应该为所有其他成员执行此操作):

B(A const& obj) : A(obj), k(10000) {}

此外,复制时您不会修改原始对象,因此您应该const引用它。这将允许您从常量对象(或通过常量引用)复制,提高常量正确性。

于 2012-07-03T15:10:53.600 回答
5

在这个构造函数中:

B(A &obj) {  A::A(obj); k=10000; };

A::A(obj);不初始化基础子对象;相反,它创建了一个本地对象,也称为obj. 等价于A::A obj;, 等价于A obj;. [更新:或者它可能做了其他事情,或者它的格式不正确——无论如何,这是错误的。]

您想使用初始化列表:

B(A & obj) : A(obj), k(10000) {}

此外,您几乎肯定希望构造函数参数为A const &,以允许从常量对象或临时对象进行构造。

于 2012-07-03T15:11:12.700 回答
4

您应该像这样初始化基类:

B(A &obj):A(obj) {  k=10000; }

(更多关于调用超类构造函数的规则是什么?)。附带说明:const用于复制构造函数参数:

A (const A &obj) {...}

编辑

初始化实例成员的首选方法是通过初始化列表,因此您的 ctor 看起来像

B(A &obj):A(obj), k(10000) { }
于 2012-07-03T15:10:15.740 回答
0
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
A()
{
    i=1;
    j=2;
}

A (A &obj)
{
    i= obj.i+100;
    j= obj.j+100;
}

 int i;
 int j;
};

class B:public A
{
public:
B():A() {i=10; j=20; k=30;}

B(A &obj)
:A(obj)
 {
  //A::A(obj);
  k=10000;
  }//

int k;
};

int main()
{
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;

    return 0;
}

这对我有用

B(A &obj)
{
    A::A(obj)
}

在 gcc 编译器上是非法的

于 2012-07-03T15:22:50.860 回答