Я изучаю C++ для экзамена, и я подумал, что я понял большую часть недоразумений в области C++ с большой усталостью, но я столкнулся с упражнением на прошедшем экзамене, который сводит меня с ума, это сочетает в себе виртуальные методы и наследование таким образом, что я не кажется, чтобы понять, вот код:C++ Наследование классов с функциями
#include <iostream>
class B;
class A {
public:
virtual A* set(A* a) = 0;
};
class B : public A {
public:
virtual A* set(B* b) {
std::cout << "set1 has been called" << std::endl;
b = this;
return b;
}
virtual B* set(A* a) {
std::cout << "set2 has been called" << std::endl;
a = this;
return this;
}
};
int main(int argc, char *argv[]) {
B *b = new B();
A *a = b->set(b);
a = b->set(a);
a = a->set(b);
a = a->set(a);
return 0;
}
выход
set1 has been called
set2 has been called
set2 has been called
set2 has been called
Из того, что я собрал первый вызов (b-> набор (b)) вызывает первый метод класса B и возвращает b, а затем этот объектre f получает casted до значения A, что теперь объект b теперь имеет тип A? поэтому у меня есть A * a = A * b; теперь имеет смысл для меня, что я должен назвать набор A, так как у меня есть такая ситуация в моем сознании objectoftypeA->set(objectoftypeA)
, так что я не должен смотреть в виртуальные методы, поскольку два объекта являются базовыми классами?
В любом случае, как вы можете видеть, у меня много путаницы, так что несите меня, если я сделаю глупые ошибки, я был бы рад, если бы кто-нибудь мог объяснить, что происходит с этим кодом, я попытался найти в Интернете, но я нахожу только маленький и легкий пример что не вызывает проблем.
Было бы полезно, если бы вы описали, что вы ожидаете *. Вы просто набросились на нас большим количеством кода и описали в предвыборном предложении, что вы не уверены, что немного сложно понять. Трудно знать, с чего начать отвечать. – Potatoswatter
Я бы ожидал, что второй вызов снова вызовет set1, но это не так, я думаю, что вся моя линия мышления ошибочна – kdma
Im не совсем уверен в этом, но пример действительно запутан, хотя. IMO, я думаю, что 'virtual B * set (A * a)' alias 'set2' будет действовать как реализация' virtual A * set (A * a) = 0; 'как' B * 'может быть неявно передана в' A * '. Таким образом, как только вы получили 'A *' из 'set1', будет вызван implmentatino, который является' set2'. EDIT: Обратите внимание, что 'set1' canant реализует чистую виртуальную функцию из-за своего специализированного параметра. Попробуйте прокомментировать каждую функцию. I gueess 'B * b = new B();' будет вызывать ошибку, если 'set2' не существует, но нет, если' set1' не существует. – Paranaix