13

この親メソッドと親変数にどのようにアクセスすればよいですか?

class Base
{
public:
    std::string mWords;
    Base() { mWords = "blahblahblah" }
};

class Foundation
{
public:
    Write( std::string text )
    {
        std::cout << text;
    }
};

class Child : public Base, public Foundation
{
    DoSomething()
    {
        this->Write( this->mWords );
        // or
        Foundation::Write( Base::mWords );
    }
};

ありがとう。

編集:あいまいさがある場合はどうなりますか?

4

3 に答える 3

13

コードで使用する 2 つの構文 (this->...および修飾名) は、名前の非表示、テンプレート基本クラスなど、あいまいさやその他の名前検索の問題がある場合にのみ必要です。

あいまいさやその他の問題がない場合は、これらの構文は必要ありません。必要なのはWrite、例のように単純な非修飾名だけです。ただWrite、そうではなく、そうではthis->WriteありませんFoundation::Write。についても同様mWordsです。

つまり、あなたの特定の例では、平野Write( mWords )はうまく機能します。


上記を説明するために、次のようにDoSomethingメソッドにmWordsパラメーターがある場合

DoSomething(int mWords) {
  ...

次に、このローカルmWordsパラメーターは継承されたクラスメンバーを非表示にしmWords、いずれかを使用する必要があります

DoSomething(int mWords) {
  Write(this->mWords);
}

また

DoSomething(int mWords) {
  Write(Foundation::mWords);
}

自分の意図を適切に表現すること、つまり、隠れているところを突破することです。


次のように、Childクラスにも独自のmWordsメンバーがある場合

class Child : public Base, public Foundation
{
  int mWords
  ...

この名前は、継承された を非表示にしmWordsます。この場合のthis->mWordsアプローチは、適切な名前を再表示するのに役立ちません。問題を解決するには、修飾名を使用する必要があります

DoSomething(int mWords) {
  Write(Foundation::mWords);
}

次のように、両方の基本クラスにmWordsメンバーがある場合

class Base {
public:
  std::string mWords;
  ...
};

class Foundation {
public:
  int mWords;
  ...

その場合Child::DoSomethingmWords名前があいまいになり、あなたがしなければならないでしょう

DoSomething(int mWords) {
  Write(Foundation::mWords);
}

あいまいさを解決します。


しかし、繰り返しになりますが、あなたの特定の例では、あいまいさがなく、名前が隠されているため、これは完全に不要です。

于 2010-12-24T01:33:35.763 に答える
0

これが最も一般的なアプローチだと思います:

Write(mWords);

あいまいさに遭遇しない限り。

(特定の) 基本クラスに何かが必要であるが、別の基本クラス (またはこのクラス) に何かが隠されているためにあいまいさやシャドウイングがある場合は、Base::name構文を使用します。

ローカル変数がメンバーの 1 つをシャドーイングしている場合は、 を使用this->しますが、一般的にはこの状況を回避する必要があります。(つまり: メンバーをシャドーするような名前のローカルを避けるようにしてください)

それを見る1つの方法は、機能し、あなたが望むことをするこれらの最初のものを使用することだと思います:

  1. name
  2. this->name
  3. Base::name
于 2010-12-24T00:52:56.660 に答える
0

命名上の競合がないため、単純にWrite(mWords). 競合するローカル変数がある場合、または名前が隠されている場合は、他の 2 つを使用します。

于 2010-12-24T00:54:04.257 に答える