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 オブジェクトを初期化する必要がありますBB私の質問は、コピー コンストラクターが取る引数は何ですか? それはオブジェクトですか?オブジェクトDにキャストされBますか?

2) のコピー コンストラクターで、 objectでD初期化Bしましたが、 type のオブジェクトがにキャストされないことを示すwhichの呼び出しがなかったため、コピー コンストラクターに引数として渡すことができます。この動作の説明はありますか?Dnoperator B()nDBB

4

1 に答える 1

4

まず、キャストは、コンパイラに変換を行うように指示するためにコードに記述するものです。変換には、暗黙的変換と明示的変換の 2 つのカテゴリがあります。キャストなしで、必要に応じて暗黙的な変換が行われます。明示的な変換にはキャストが必要です。ここで話しているのは、キャストではなく暗黙の変換です。

その答えは、派生型への参照から基本型への参照への暗黙的な変換があるということです。それは簡単です: n は D& であり、暗黙的に型を変換するだけで B& を取る関数に渡すことができます。

于 2012-10-26T19:40:17.167 に答える