考慮類層次結構,其中A
是基類,B
源自A
。爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
如果在B
中未定義複製構造函數,則編譯器將合成一個。當被調用時,這個拷貝構造函數將調用基類拷貝構造函數(即使合成的,如果用戶沒有提供)。
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
輸出:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
如果用戶定義B
它自己的拷貝構造函數被調用時,這個拷貝構造函數會調用基類的默認構造函數,除非到呼叫基類複製構造函數是明確存在的(例如,在初始化列表中)。
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
B(const B& rhs) {
std::cout << "B::Copy constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
輸出:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
我的問題是,爲什麼沒有用戶定義的拷貝構造函數調用基類的拷貝構造函數的默認行爲?
如果是這樣的默認情況下,你會如何指定你不希望發生這種情況? – PlasmaHH 2012-02-07 14:48:47
@PlasmaHH'ParentClass()'在初始化程序列表中。我相信這仍然會很不一致和令人困惑。 – 2012-02-07 14:50:14
@MarkB:的確,我希望他在思考時得出同樣的結論...... – PlasmaHH 2012-02-07 14:52:27