質問

2011-01-28 15 views
7

私は2つのクラスがあります:誰かが(ハローに理由を以下の二つの呼び出しを説明でき質問

class x { 
public: 
    virtual void hello() { 
    std::cout << "x" << std::endl; 
    } 
}; 

class y : public x { 
public: 
    void hello() { 
    std::cout << "y" << std::endl; 
    } 
}; 

)が異なるメッセージを印刷しますか?なぜ彼らは両方とも "y"を印刷しないのですか?それは最初のものがコピーであり、2番目のものが実際にメモリ内のオブジェクトを指しているからですか?

int main() { 
    y a; 

    x b = a; 
    b.hello(); // prints x 

    x* c = &a; 
    c->hello(); // prints y 
    return 0; 
} 
+3

私はこの人が正当な理由、正しい仕事を正確に推測しているのを初めて見たと思います。 – GManNickG

答えて

6

はい、あなたは正しいです

x b = a; 

は、コピーコンストラクタ(bは 'X' IS)

x& b = a; 

は、基準を割り当て、オーバーライドを使用しますが(bはまだ起動します実際には「y」)

0

x b = a aからbをコピーします。 bはタイプxなので、タイプxのオブジェクトになります。タイプxのオブジェクトはxを出力します。

yを取得する唯一の方法は、タイプyのオブジェクトを呼び出すときです。

6

x b = a;slicesです。

このコードを実行すると、元のya 'のコピーであるyではなく、新しいxが作成されます。

+1

ありがとう、私は新しい語彙を学んだ – Marlon

0

b.hello()版画「X」caを指し、aがあなたのために混乱するかもしれませんどのようなクラスYのインスタンス

では、ということですので、bは、クラスX. c->hello()版画「Y」のインスタンスであるため、 x b = a;と書くと、新しいオブジェクトbが作成され、aで初期化されます。 x* c = &a;と書くと、cは新しいオブジェクトではありません。既存のオブジェクトにエイリアスを導入したばかりです。