2
class A{
public:
 virtual void foo() {cout << "A::foo" << endl;}
};

class B: public A{
public:
virtual  void foo() {cout << "B::foo" << endl;}
};

int main(void){
 A a;
 B b;
 A acast=(A)B;
 A *apointer=&B;
 acast.foo(); // A::foo
 apointer->foo() //B::foo
 return 0;
}

2つのプリントの動作が異なるのはなぜですか?

4

3 に答える 3

7

A acast=(A)b;(これが実際にあると仮定して)オブジェクトをスライスし、スライスしたオブジェクトを使用してをコピー構築しAます。と同等A acast=A(b);です。acast動的および静的タイプでありA、もはやB。まったく新しいオブジェクトです。

A *apointer=&b;対照的に、は動的型が。であるオブジェクトへのポインタですB。元のbオブジェクトは変更されず、基本型へのポインターによって参照されるだけです。動的型がであるため、からBのメソッドが呼び出されます(これは、ポリモーフィズムが機能するためです)。fooBvirtual

于 2012-11-13T20:42:59.830 に答える
3

オブジェクトスライス、A acast=(A)b;スライスB

于 2012-11-13T20:43:36.760 に答える
1

最初の例は、コンパイラがオブジェクトをタイプAであると理解する明示的なキャストです。2番目の例では、ポインタを設定するだけで、コンパイラはオブジェクトをタイプBと見なします。

于 2012-11-13T20:44:35.103 に答える