2010-12-19 14 views
1

基本クラスに同じ関数名があり、関数ごとに異なるコードを持つ派生クラスがある場合は、自分の関数を仮想として設定する必要があるのですか?仮想メンバー関数の必要性

+0

機能にも同じ署名がありますか? – EnabrenTane

+0

おそらく。それはバーチャルではないはずです。あなたの質問から伝える方法はありません。 Googleの多型。 –

答えて

3

メソッドを仮想化する必要はありません。しかし、「遅い束縛」、つまり、基本ポインタが与えられた場合に、派生したメソッドを呼び出すことを望むならば、それは仮想でなければなりません。

これらのメソッドが無関係である場合は、これらのメソッドは無関係であることがよくあります。この場合、派生クラスのメソッドに異なる名前を付けることをお勧めします。

0

仮想関数の呼び出しは、実行時に動的にディスパッチされます。これが多型の基礎です。

基本クラスで仮想として宣言された関数は、暗黙的にサブクラスで仮想になります。

0

いいえ、そうする必要はありません。

実際には、仮想プログラムを宣言するときとそうでないときは、効果的なプログラム設計自体の一部です。

仮想と純粋仮想機能の詳細についてはhereをご覧ください。

0

派生クラスのインスタンスへの基本クラスポインタを使用し、その関数のシグネチャが同じである場合は、おそらく関数virtualを作成し、クラスデストラクタvirtualを作成します。このようにして、派生型への親クラスポインタを持ち、その関数を呼びたい場合、親クラスと異なる場合、子クラスのバージョンを実行したいと思うでしょう。

class Parent 
{ 
public: 
    virtual ~Parent() {} 

    virtual void doSomething() 
    { 
     std::cout << "Parent"; 
    } 
}; 

class Child : public Parent 
{ 
public: 
    virtual ~Child() {} 

    virtual void doSomething() 
    { 
     std::cout << "Child"; 
    } 
}; 

int main() 
{ 
    Parent *p = new Child(); 
    p->doSomething(); // prints "Child" because of dynamic dispatch 
} 
0
class A { 
public: 
    void Foo() {} 
    virtual void Bar() {} 
}; 
class B : public A { 
public: 
    void Foo() {} 
    virtual void Bar() {} 
}; 

int main() { 
    A *a = new A; 
    B *b = new B; 
    A *c = b; 

    a->Foo(); // calls A::Foo on a 
    b->Foo(); // calls B::Foo on b 
    c->Foo(); // calls A::Foo on b 

    a->Bar(); // calls A::Foo on a 
    b->bar(); // calls B::Foo on b 
    c->bar(); // calls B::Foo on b 

    delete a; 
    delete b; 
} 

C++ FAQ § Inheritance — virtual functionsを参照してください。