基本クラスに同じ関数名があり、関数ごとに異なるコードを持つ派生クラスがある場合は、自分の関数を仮想として設定する必要があるのですか?仮想メンバー関数の必要性
1
A
答えて
3
メソッドを仮想化する必要はありません。しかし、「遅い束縛」、つまり、基本ポインタが与えられた場合に、派生したメソッドを呼び出すことを望むならば、それは仮想でなければなりません。
これらのメソッドが無関係である場合は、これらのメソッドは無関係であることがよくあります。この場合、派生クラスのメソッドに異なる名前を付けることをお勧めします。
0
仮想関数の呼び出しは、実行時に動的にディスパッチされます。これが多型の基礎です。
基本クラスで仮想として宣言された関数は、暗黙的にサブクラスで仮想になります。
0
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;
}
関連する問題
- 1. C++親メンバー関数内の仮想関数の振る舞い
- 2. 仮想関数オーバーライド仮想関数
- 3. C++多態性と非仮想関数
- 4. 仮想関数
- 5. クラウドコンピューティング、仮想デスクトップが必要
- 6. プライベート仮想関数
- 7. 仮想関数は
- 8. 仮想関数const vs仮想関数non-const
- 9. メンバー関数はデフォルトで仮想ですか?
- 10. [[noreturn]]仮想関数のオーバーライド
- 11. 仮想関数のフック/ディテール
- 12. 仮想関数の使用
- 13. 仮想関数のリンカエラーC++
- 14. 仮想テンプレート関数のオーバーロード
- 15. 仮想関数の継承
- 16. 仮想関数の実装
- 17. 仮想関数のオーバーロード
- 18. 仮想属性
- 19. 仮想属性
- 20. 仮想属性
- 21. - 仮想属性
- 22. C++継承:仮想メンバーは再宣言を必要としますか?
- 23. C++仮想関数とスレッド
- 24. 仮想関数と迂回
- 25. C++(仮想)関数テーブル
- 26. 継承と仮想関数
- 27. 仮想関数出力?
- 28. 仮想関数やジェネリックプログラミング
- 29. 抽象関数と仮想関数
- 30. 仮想デストラクタ - 必要な場合
機能にも同じ署名がありますか? – EnabrenTane
おそらく。それはバーチャルではないはずです。あなたの質問から伝える方法はありません。 Googleの多型。 –