-1

このコードに関して:

#include <iostream>

class CClass1
{
public:
    void print() {
        std::cout << "This should print first" << std::endl;
    }
};

class CClass2
{
public:
    void print() {
        std::cout << "This should print second" << std::endl;
    }
};

そのため、誰かが、そのオブジェクトの新しいタイプを作成することなく、異なるオブジェクトの複数のインスタンスを指すことができる「フリーポインター」(いわば) を持つことについて興味深い質問をしました。その人は、このポインターが型である可能性がvoid *あり、それが無効であるため、オブジェクトの任意のインスタンスを指すようにして、オブジェクトのパブリック プロパティにアクセスできるという考えを持っていました。

次の解決策が提出されました。

int main() {
    void *pClass(NULL);
    ((CClass1 *)(pClass))->print();
    ((CClass2 *)(pClass))->print();
    std::cin.ignore();
    return 0;
}

私の質問は、なぜ上記が機能するのかということですが、これは機能しません:

int main() {
    (CClass1 *FG)->print();
    (CClass2 *FG)->print();
    std::cin.ignore();
    return 0;
}
4

1 に答える 1

1

最初の例は、有効なオブジェクトを指していないポインターを介して非静的メンバー関数を呼び出すことにより、未定義の動作を示します。問題の機能がたまたままったく使用されていないため、偶然に機能しているように見えますthis

あなたの2番目の例は、非常に単純に、構文的に正しくありません。あなたがそこで何をしようとしているのかさえわかりません。コードは意味がありません。

于 2013-08-24T01:35:26.713 に答える