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