如何将复制构造函数与基类一起使用
How to use a copy constructor with a base class?
我对基类和复制构造函数感到困惑。
假设我有一个班级
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
时,如何确保class A
中的m
值也被复制?
默认的复制构造函数将复制所有成员变量,无论它们位于基类还是派生类中。
如果您为类B创建自己的复制构造函数,则需要自己复制类A成员,或者最好在初始值设定项列表中使用类A的复制构造函数。
class B : public A {
public:
// ...
B(const B & b) : A(b), n(b.n) {}
// ...
};
在派生副本构造函数之前,将自动调用基本副本构造函数。这与常规构造函数相同。(更准确地说,在派生构造函数继续之前,派生初始化列表会调用基构造函数)。在您的情况下,默认的复制构造函数就足够了。
但是,请注意不要将B复制到a中(搜索对象拼接)。
此代码是您的代码,只是复制构造函数添加了一个类:
#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 Output表示两者都是复制的。
可以认为A
中有一个类型为B
的隐藏成员,该隐藏成员可以像上面的程序中那样初始化或复制为普通成员,使用:
B(Int n, Int m) : A(m), n(n)
您不应该从构造函数/析构函数返回,甚至不应该从void返回。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 将派生类方法与基类unique_ptr一起使用
- C++将已删除的函数 std::unique_ptr 与基类一起使用
- 将initalizer列表与从空基类继承的结构一起使用
- Vtables是否仅与指向基类的指针一起使用
- C++将基类对象和派生类对象存储在一起
- 在将抽象基类作为参数的函数中将指针和赋值运算符与派生类一起使用
- 将基类函数与派生类值一起使用
- 如何将复制构造函数与基类一起使用