Entry tags:
Посыпаю голову пеплом, ухожу в монастырь
Берём простейший код:
class B {
public:
void method(char c);
void method(int i);
};
class M {
int i;
};
class D: public B {
public:
void method(M);
};
int main() {
D d;
M m;
d.method('c'); // не работает
d.method(0); // тоже не работает
d.method(m); // работает
}И обнаруживаем, что для объекта производного класса методы базового нифига не вызываются (error: no matching function for call to `D::method(char)'), потому что они перекрыты одноимённым методом в производном.
И где, спрашивается, это ваше хвалёное наследование?
Да, если из D убрать одноимённый метод, то всё работает.
Кто знает, чем обусловлена такая странность?
no subject
А он должен так работать, вообще?
(удаляется, подумывая, не научиться ли писать на C++)
no subject
А вот если есть хоть одна, даже не перекрывающая по аргументам базовый вариант, то фиг.
no subject
class D: public B {
public:
using B::method;
void method(M);
};
По идее должно сказать компайлеру лукапить имя и в базовом классе. Ну или явно приводить к нужному типу в точке вызова.
no subject
no subject
Исправь class D так:
class D: public B { using B::method; public: void method(M); };no subject
no subject
no subject
Во времена Страуса namespace'ы ещё не изобрели.
no subject
no subject
no subject
no subject
То, что ты нарисовал, называется hiding, оно же - сокрытие, и вступает в силу, если есть коллизия имён у потомков и предков. Для наследования необходимо, чтобы а) у фнукций были идентичные сигнатуры и наличие где-нибудь (где тебе больше нравится, но я обычно пишу в начале строки, где объявляю функцию) ключевого слова virtual, или б) отсутствие символов с таким же именем в классе наследнике.
Если же ты хочешь из класса предка вытащить символы и сделать их доступными в классе потомке, то надо действительно использовать ключевое слово using.
Теперь про то, чем обусловленно: представь, что все символы из класса предка экспортируются в класс наследник. Ты не можешь отказаться от этого поведения. Если ты хочешь ввести в потомке символ, разрешаемый по более общему типу, то не можешь этого сделать. Ты не сможешь отловить на этапе компиляции целую кучу ошибок. В существующем порядке ты можешь сам написать, какие символы импортировать.
no subject
а) virtual тут вовсе ни при чём, я про полиморфизм ничего не гворил, по ссылке ничего не вызывал, я хочу просто для объекта вызывать метод из его класса, если он есть, а если нет - то унаследованный от базового.
2) не понимаю, чем принципиально отличается перегрузка невиртуальных методов в пределах одного класса и в базовом и порождённом. Пойдем на кухню, ты мне на пальцах покажешь
no subject
Т.е. вот такой пример есть в страуструпе:
void f(int);
void g()
{
void f(double);
f(1) ; // call f(double)
}
И в принципе идея здравая нужно сказать.
no subject
11 апреля, ок?
no subject
no subject
спасет еще лучше :))))
Вот то-ли дело "нога прострелить себе вы" :))
no subject
no subject
Можно удалять! :))