C++派生类的拷贝或移动构造函数
1. 当派生类定义了拷贝或移动构造函数,必须显式地调用基类的拷贝或移动构造函数,否则会调用基类的默认构造函数
#include <iostream>
class Base {
public:
Base() { std::cout << "Base default constructor" << std::endl; }
Base(const Base &b) { std::cout << "Base copy constructor" << std::endl; }
Base(Base &&b) { std::cout << "Base move constructor" << std::endl; }
};
class Derived : public Base {
public:
Derived() { std::cout << "Derived default constructor" << std::endl; }
Derived(const Derived &d) { std::cout << "Derived copy constructor" << std::endl; }
Derived(Derived &&d) { std::cout << "Derived move constructor" << std::endl; }
};
int main() {
Derived d;
Derived d1(d);
Derived d2(std::move(d));
return 0;
}
输出结果:
Base default constructor
Derived default constructor
Base default constructor
Derived copy constructor
Base default constructor
Derived move constructor
显式调用,将派生类修改为:
class Derived : public Base {
public:
Derived() { std::cout << "Derived default constructor" << std::endl; }
Derived(const Derived &d) : Base(d) { std::cout << "Derived copy constructor" << std::endl; }
Derived(Derived &&d) : Base(std::move(d)) { std::cout << "Derived move constructor" << std::endl; }
};
输出结果:
Base default constructor
Derived default constructor
Base copy constructor
Derived copy constructor
Base move constructor
Derived move constructor
2. 当派生类未定义拷贝或移动构造函数,若基类有拷贝和移动构造函数,则派生类将获得合成的拷贝和移动构造函数,且调用的是基类的拷贝或移动构造函数
#include <iostream>
class Base {
public:
Base() { std::cout << "Base default constructor" << std::endl; }
Base(const Base &b) { std::cout << "Base copy constructor" << std::endl; }
Base(Base &&b) { std::cout << "Base move constructor" << std::endl; }
};
class Derived : public Base {
};
int main() {
Derived d;
Derived d1(d);
Derived d2(std::move(d));
return 0;
}
输出结果:
Base default constructor
Base copy constructor
Base move constructor