0
    class Base
    {  
         int iBase;

      public:           
         virtual void display()
         {
            cout<<"I am a Base Class"<<endl;
         }        
    };

    class Derived : public Base
    { 
        int iDerived;

     public:
        Derived()
        {
            cout<<"In Derived Default Constructor"<<endl;
            iDerived=10;
        }   

        void display()
        {
            cout<<"I am in Derived Class"<<endl;
            cout<<"value of iDerived  :"<<iDerived<<endl;
            iDerived=100;
            cout<<"value of iDerived  :"<<iDerived<<endl;
        }                
   };

メインで:

     Base *varBase;
     Derived varDerived;

     varBase = &varDerived;
     varBase->display();
     varBase->iDerived=10; // Error: iDerived is not a member of Base: ?????

こんにちは、みんな、

オブジェクトスライシングを理解し、いくつかのサンプルプログラムを試してみています。

ポインタ参照でどこかを読んだObjcetSlicingは起こりません。

しかし、以下の例では、からiDerivedアクセスできないことに気づいていますが、ローカルスコープのdisplayメソッドに含まれていなくてもアクセスできます。Base pointer(varBase)virtual display method of class

今私の質問は:

  1. 仮想関数でのみiDerived変数にアクセスできるのはなぜですか?これは適切ですか?
  2. オブジェクトのスライスを回避する方法。
4

2 に答える 2

2

サンプルコードには、スライスはまったく含まれていません。あなたがしたことは、基本的なポリモーフィズムを呼び出すことだけです。Base::display()asを宣言しvirtual、を呼び出すことにより、ポイントされているオブジェクトの実際のタイプである。でメンバー関数を動的に呼び出すように要求しました。のメンバー変数はのスコープ内にあるため、コンパイルして機能します。display()Base *DerivedDerivedDerived::display()

ただし、 Baseで宣言されたメンバー変数(または関数)に直接アクセスできるのは、へのポインターを介してのみBaseです。そのためvarBase->iDerived、コンパイルされません。

通常、スライスには次のようなものが含まれます。

Derived d;
Base b = (Base)d;

オブジェクトを明示的に割り当て/初期化することによりBase、すべてのDerived特定のメンバーが失われます(つまり、それらは「スライス」されます)。

これは比較的基本的なものです。C++でまともな本を手に入れることをお勧めします。ここに良いもののリストがあります:決定的なC++ブックガイドとリスト

于 2011-01-24T08:51:19.447 に答える
0

C ++には仮想関数がありますが、仮想データはありません。

以下を追加してシミュレートできます。

class Base {
  // What you had before
  virtual int getAnInt() const = 0; // =0 means that Derived must implement this
};
class Derived {
  // What you had before
  virtual int getAnInt() const { return iDerived; }
};

オブジェクトのスライスは完全に無関係であり、あなたの例では起こりません。

于 2011-01-24T09:03:35.393 に答える