我对基类和复制构造函数感到困惑。
说我有一个班级
class A {
public:
A(int m) : m(m) { return; }
virtual ~A() { return; }
int m;
}
一个继承了这个
的类class B : public A {
public:
B(int n, int m) : A(m), n(n) { return; }
vitual ~B() { return; }
int n;
}
当我复制class B
时,如何确保同时复制m
中的class A
值?
答案 0 :(得分:4)
默认的复制构造函数将复制所有成员变量,无论它们是驻留在基类还是派生类中。
如果为B类创建自己的复制构造函数,则需要自己复制A类成员,或者更好地在初始化列表中使用A类的复制构造函数。
class B : public A {
public:
// ...
B(const B & b) : A(b), n(b.n) {}
// ...
};
答案 1 :(得分:1)
将在派生的复制构造函数之前自动调用基本复制构造函数。它与常规构造函数相同。 (更准确地说,在派生构造函数继续之前,派生初始化列表会调用基础构造函数)。在您的情况下,默认的副本构造函数就足够了。
但请注意,不要将B复制到A(搜索对象拼接)。
答案 2 :(得分:0)
此代码是您的代码,只是复制构造函数添加了类:
#include <iostream>
using namespace std;
struct Int
{
Int ()
{
}
Int(const Int&)
{
cout<< "Int copied" "\n";
}
};
class A
{
Int m;
public:
A(Int m) : m(m)
{
}
virtual ~A()
{
}
};
class B : public A
{
Int n;
public:
B(Int n, Int m) : A(m), n(n)
{
}
virtual ~B()
{
}
};
void f(B)
{
}
int main()
{
Int m,n;
B b(m,n);
cout<< "\n" "start:" "\n";
f(b);
cout<< "end";
}
Ubuntu Qt Creator输出说两者都被复制了。
可以认为B
中存在A
类型的隐藏成员,并且可以将此隐藏成员初始化或复制为上述程序中的常规成员:
B(Int n, Int m) : A(m), n(n)
答案 3 :(得分:-1)
你不应该从构造函数/析构函数返回,甚至不能返回。