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: старайтесь не называть местных жителей так, чтобы они теневые члены)
Я полагаю, что один из способов взглянуть на это-использовать первый из них, который работает и делает то, что вы хотите:
namethis->nameBase::name