10
class Material
{
public:
 void foo()
 {
  cout << "Class Material";
 }
};

class Unusual_Material : public Material
{
public:
 void foo()
 {
  cout << "Class Unusual_Material";
 }
};

int main()
{
 Material strange = Unusual_Material();
 strange.foo(); //outputs "Class Material" 

 return 0;
}

これにより、「Class Unusual_Material」がコンソールに表示されるようにしたいと思います。これを達成する方法はありますか?私のプログラムには、他のより具体的なマテリアルが派生するクラス Material があります。メソッド Material::foo() は、ほとんどのマテリアルに適した Material のメソッドを表しますが、まれに、異常なプロパティを持つマテリアルに対して別の foo() を定義する必要があります。

私のプログラムのすべてのオブジェクトには、Material フィールドが含まれています。それらに通常とは異なるマテリアルが割り当てられている場合は、派生した通常とは異なる foo が呼び出されるようにしたいと思います。

これはおそらく非常に簡単か不可能のどちらかですが、どちらにしてもわかりません。

ありがとう

4

2 に答える 2

20

あなたが望むのはポリモーフィズムであり、関数に対してそれを有効にするには、それを作成する必要がありますvirtual:

class Material 
{ 
public: 
    virtual void foo() // Note virtual keyword!
    { 
        cout << "Class Material"; 
    } 
}; 

class Unusual_Material : public Material 
{ 
public: 
    void foo() // Will override foo() in the base class
    { 
        cout << "Class Unusual_Material"; 
    } 
}; 

また、ポリモーフィズムは参照とポインターに対してのみ機能します。

int main()  
{  
    Unusual_Material unusualMaterial;
    Material& strange = unusualMaterial;
    strange.foo();  
    return 0; 
}

/* OR */

int main()  
{  
    Unusual_Material unusualMaterial;
    Material* strange = &unusualMaterial;
    strange->foo();  
    return 0; 
}

コード スニペットにあるものは、オブジェクトをスライスしUnusual_Materialます。

int main() 
{ 
    // Unusual_Material object will be sliced!
    Material strange = Unusual_Material(); 
    strange.foo(); 
    return 0; 
} 
于 2010-11-17T20:48:29.973 に答える
1

さらに良い説明は..

class Base
{
public:
 void foo()     //make virtual void foo(),have derived method invoked
 {
  cout << "Class Base";
 }
};
class Derived: public Base
{
public:
 void foo()
 {
  cout << "Class Derived";
 }
};
int main()
{
 Base base1 = Derived ();
 Base1.foo(); //outputs "Class Base" 
           // Base object, calling base method

 Base *base2 = new Derived ();
 Base2->foo(); //outputs"Class Base",Again Base object calling base method

// But to have base object, calling Derived method, following are the ways
// Add virtual access modifier for base foo() method. Then do as below, to //have derived method being invoked.
//
// Base *base2 = new Derived ();
// Base2->foo();    //outputs "Class Derived" .

return 0;
}
于 2013-10-17T13:27:02.977 に答える