2016-04-26 8 views
0

毎回は...私は、派生クラスのオブジェクトを持つベースクラスオブジェクトを初期化するとき仮想関数doesntの仕事私はそれは常に、基本クラスを呼びかけDrawメソッドを呼び出す

#pragma once 
#include <pch.h> 
#include <A.h> 

class B: public A 
{ 
public: 
    B(); 

    void Draw(CanvasDrawingSession^ drawingSession); 
}; 

由来

#pragma once 
    #include <pch.h> 

    class A 
    { 
    public: 
     A(); 

     virtual void Draw(CanvasDrawingSession^ drawingSession); 
    }; 

クラスB A a = B()、Drawメソッドを呼び出す - a.Draw()は、基本クラスから常にDraw()を呼び出します。私は間違っているの?

+3

'A a = B()'は*オブジェクトのスライス*を行い、基本的に 'B'インスタンスを' A'インスタンスに変換します。 C++の多態性は、基本クラスに対して*ポインタ*と*参照*を使って動作します。 –

答えて

2

コード A = B()タイプBのインスタンスを構築し、その後コンパイラはあなたのためのデフォルトのコピーコンストラクタを生成したタイプAの変数に割り当て ...

A::A(const A&) 

... Bのインスタンスからの割り当てがAAのサブクラスであるため)のインスタンスであるため、Bの変数からの代入には問題ありません。BのインスタンスはすべてAのインスタンスです。

この効果は、object slicingとして知られています。

コードを機能させるには、B -nessを捨てないでください。あなたは、例えばこれを行うことができます:

B::Draw()を呼び出します
B the_b = B(); 
A* a_ptr = &the_b; 
a_ptr->Draw() 

+0

今私は "読み取りアクセス違反"を取得していますAはnullptrでした –

+0

私の例では、 '' 'a_ptr'''を' '' A * a_ptr = &the_b; '' 'で初期化しています。 –

関連する問題