C++: доступ к родительским методам и переменным

каким образом я должен получить доступ к этому родительскому методу и родительской переменной?

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 );
    }
};

спасибо.

Edit: а что, если есть двусмысленность?

3 ответов


два синтаксиса, которые вы используете в своем коде (this->... и квалифицированные имена) необходимы только специально, когда есть двусмысленность или какая-то другая проблема поиска имени, например, скрытие имени, базовый класс шаблона и т. д.

когда нет двусмысленности или других проблем, вам не нужен ни один из этих синтаксисов. Все, что вам нужно, это просто имя, как Write в вашем примере. Просто Write, а не this->Write, а не Foundation::Write. То же самое относится к mWords.

т. е. в конкретный пример простой Write( mWords ) будет работать нормально.


чтобы проиллюстрировать вышесказанное, если ваш DoSomething метод


поскольку нет конфликта имен, просто используйте Write(mWords). Используйте другие 2 Если у вас есть локальные переменные, которые конфликтуют, или когда имена будут скрыты.


Я думаю, это самый распространенный подход:

Write(mWords);

если вы не столкнетесь с двусмысленностью.

если есть двусмысленность или затенение, потому что вы хотите что-то в (конкретном) базовом классе, но что-то в другом базовом классе (или этом классе) скрывает его, используйте Base::name синтаксис.

если локальная переменная затеняет один из ваших членов, используйте this->, хотя в целом вы должны попытаться избежать такой ситуации. (ie: старайтесь не называть местных жителей так, чтобы они теневые члены)

Я полагаю, что один из способов взглянуть на это-использовать первый из них, который работает и делает то, что вы хотите:

  1. name
  2. this->name
  3. Base::name