0

オブジェクトへのポインターを持つ単純な C++ (Linux) プロジェクトに取り組んでいます。クラス A、A を拡張するクラス B、および B を拡張するクラス C があります。クラス C には、A または B に存在しないメソッド (テスト) があります。

タイプ A、B、および C のオブジェクトを指すことができる単一のポインター 'p' を持つことは可能ですか? そのポインターをどのように定義しますか?

次に、 a.test() は存在しませんが、c.test() は存在するため、汎用ポインター 'p' は p->test() を呼び出すことができますか? これはコンパイルされますか?実行時に p がクラス A のオブジェクトを指していて、p->test() を呼び出したらどうなるでしょうか? それは実行時エラーですか?

4

1 に答える 1

4

タイプ A、B、および C のオブジェクトを指すことができる単一のポインターを持つことは可能ですか?

「Aオブジェクト、Bオブジェクト、またはCオブジェクトのいずれかを指すことができる」という意味だと思いますよね?

はい、そのようなポインタを持つことができます。

そのポインターをどのように定義しますか?

A*

基本クラス ポインターは、派生クラスのオブジェクトを指すことができます。

次に、ポインターが A/B/C クラスを指すことができる場合、オブジェクトのメソッドをどのように呼び出すのでしょうか?

virtualで関数を定義し、およびAでオーバーライドします。次に、 を介してメソッドを呼び出すと、言語は動的ディスパッチを実行します。つまり、 が を指しているか、 を指しているか、または を指しているかに応じて、適切なメソッドを自動的に呼び出します。BCA*A*ABC

メソッドを呼び出す前にキャストする必要がありますか?

いいえ、それは仮想関数の目的をほとんど無効にします。

完全な例を次に示します。

#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
于 2015-09-20T14:39:41.253 に答える