[c++] Делегирование при переопределении оператора
class Base
{
public:
Base& operator<<(int value)
{
cout << "Base int" << endl;
return *this;
}
virtual Base& operator<<(const char* v)
{
cout << "Base char" << endl;
return *this;
}
};
class Inherited: public Base
{
public:
using Base::operator<<;
Base& operator<<(const char* v)
{
cout << "Derived char" << endl;
Inherited& b = *this;
b << 10;
return *this;
}
};
int main
{
Inherited i;
i << "zzz";
return 0;
}
Детали смотри здесь
Спасибо. Немного озадачивает, что объект ведёт себя по-разному, в зависимости от того, по ссылке какого типа он торчит.
class Inherited : public Base
{
public:
Base& operator<<(const char* v)
{
Inherited& b = *this;
b.Base::operator<<(10);
return *this;
}
};
class Base
{
public:
void A {}
};
class Inherited: public Base
{
public:
void B {}
};
int main
{
Inherited* i = new Inherited;
i->B;
Base* b = i;
b->B; // Do not compile
return 0;
}
Мы не можем вызвать у b метод B, хотя для i можем, а это тот же самый объект.
По поводу сокрытия имен, почему это было сделано, есть пример здесь
Ну да, про этот вариант я забыл
Я имел ввиду странно, что тривиальный каст (к базовому типу) меняет поведение. По идее наследник же во всех смыслах является объектом базового класса (ну, должен а оказывается нет.
Ну да, этот вариант кажется нелогичным, конечно, но были причины, почему это сделается - я тебе ссылку указал, у саттера, вроде, было еще про это неплохо написано, но сходу, я что-то не нашел
Оставить комментарий
danilov
Плюсы не родной. Столкнулся с проблемой. Почему при использовании оператора из базового класса внутри оператора же из отнаследованного класса, но с другими аргументами, первый оператор не резолвится?Замена
Inherited& b = *this;
на
Base& b = *this;
работает.
VS2013