タイプ A、B、および C のオブジェクトを指すことができる単一のポインターを持つことは可能ですか?
「Aオブジェクト、Bオブジェクト、またはCオブジェクトのいずれかを指すことができる」という意味だと思いますよね?
はい、そのようなポインタを持つことができます。
そのポインターをどのように定義しますか?
A*
基本クラス ポインターは、派生クラスのオブジェクトを指すことができます。
次に、ポインターが A/B/C クラスを指すことができる場合、オブジェクトのメソッドをどのように呼び出すのでしょうか?
virtual
で関数を定義し、およびA
でオーバーライドします。次に、 を介してメソッドを呼び出すと、言語は動的ディスパッチを実行します。つまり、 が を指しているか、 を指しているか、または を指しているかに応じて、適切なメソッドを自動的に呼び出します。B
C
A*
A*
A
B
C
メソッドを呼び出す前にキャストする必要がありますか?
いいえ、それは仮想関数の目的をほとんど無効にします。
完全な例を次に示します。
#include <iostream>
class A
{
public:
virtual ~A() {} // not really needed in this program,
// but almost always needed in real code
// when a class has a virtual function
virtual void method() { std::cout << "A::method\n"; }
};
class B : public A
{
public:
virtual void method() override { std::cout << "B::method\n"; }
};
class C : public A
{
public:
virtual void method() override { std::cout << "C::method\n"; }
};
int main()
{
A a;
B b;
C c;
A* ptr = &a;
ptr->method();
ptr = &b;
ptr->method();
ptr = &c;
ptr->method();
}
出力:
A::method
B::method
C::method