代码:
#include<iostream>
using namespace std;
class B{
public:
int b;
B(int x):b(x){
cout << "B() Constructor " << endl;}
B(const B& m):b(m.b){
cout << "B(const B&) copy constructor "<< endl;}
};
class D:public B{
public:
D(int x):B(x){
cout << "D() Constructor " << endl;}
D(const D& n):B(n){ // at this point n should be casted to B object !!?
cout << "D(const D&) copy constructor " << endl;}
operator B(){
cout << "operator B" << endl;
return B(this->b);}
};
int main(){
D ob(1);
cout << "---" << endl;
D oc=ob;
}
输出:
B() Constructor
D() Constructor
---
B(const B&) copy constructor
D(const D&) copy constructor
问题:
1)如果我没有提供我的D
拷贝构造函数,D
的默认拷贝构造函数必须通过调用B
拷贝构造函数来初始化Base对象。我的问题是B
的复制构造函数将采用什么论点?它是D
对象然后它将被转换为B
对象吗?
2)在D
的复制构造函数中,我使用B
对象D
初始化了n
,并且没有调用operator B()
来证明类型n
的对象D
未被转换为B
,因此它可以作为参数传递给B
复制构造函数。这种行为有什么解释吗?
答案 0 :(得分:4)
首先,您在代码中编写强制转换以告诉编译器进行转换。转换分为两类:隐式和显式。隐式转换将在需要时完成,无需强制转换。显式转换需要强制转换。你在这里谈论的是一个隐式转换,而不是演员。
答案是,从引用到派生类型的隐式转换为对基类型的引用。就这么简单:n是D&amp;,它可以传递给一个带有B&amp; B的功能。只需隐式转换其类型。