0

代码:

#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必须通过调用复制构造函数来初始化 Base 对象B。我的问题是复制构造函数的参数是什么B?它是一个D对象,然后它将被转换为一个B对象吗?

2) 在 的复制构造函数中,我使用object进行了D初始化,并且没有调用which 证明类型的对象没有被强制转换为,因此它可以作为参数传递给复制构造函数。这种行为有什么解释吗?BDnoperator B()nDBB

4

1 回答 1

4

首先,强制转换是您在代码中编写的用于告诉编译器进行转换的东西。有两类转换:隐式和显式。隐式转换将在需要时完成,无需强制转换。显式转换需要强制转换。您在这里谈论的是隐式转换,而不是强制转换。

答案是存在从对派生类型的引用到对基类型的引用的隐式转换。就这么简单:n 是一个 D&,它可以通过隐式转换其类型来传递给一个接受 B& 的函数。

于 2012-10-26T19:40:17.167 回答