c ++ Derived Default copy构造函数初始化Base拷贝构造函数是什么?

时间:2012-10-26 19:35:48

标签: c++ copy-constructor

代码:

#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复制构造函数。这种行为有什么解释吗?

1 个答案:

答案 0 :(得分:4)

首先,您在代码中编写强制转换以告诉编译器进行转换。转换分为两类:隐式和显式。隐式转换将在需要时完成,无需强制转换。显式转换需要强制转换。你在这里谈论的是一个隐式转换,而不是演员。

答案是,从引用到派生类型的隐式转换为对基类型的引用。就这么简单:n是D&amp;,它可以传递给一个带有B&amp; B的功能。只需隐式转换其类型。