Я смотрел видео, которое можно найти на https://www.youtube.com/watch?v=4F72VULWFvc, и мне очень понравилась часть концепции для представленных случаев. Но я работаю со связанным списком и необходимости селективного выполнения метода, например:Наследование, выполнение выборочного метода
#include <stdio.h>
class A {
public:
A() : next(0) {
if (head == 0) {
head = this;
} else {
A* step = head;
while (step->next != 0) {
step = step->next;
}
step->next = this;
}
}
virtual ~A() {
if (head == this) {
head = 0;
} else {
A* step = head;
while (step->next != this) {
step = step->next;
}
step->next = next;
}
}
virtual void foo() {
// Do nothing...
}
static A* head;
A* next;
};
class B : public A {
public:
B() {}
virtual ~B() {}
virtual void foo() {
printf("function foo\n");
}
};
A* A::head = 0;
int main() {
A a_cls;
B b_cls;
A* step = A::head;
while (step != 0) {
step->foo();
step = step->next;
}
return 0;
}
После инстанцирования всех объектов, методу foo()
объектов класса B
нужен выполнить. Для этого виртуальный метод foo()
добавлен в класс A с пустым телом virtual void foo() {}
, а в классе B код добавляется к методу foo()
.
Это работает, но мне не нравится, в основной функции похоже, что вы делаете что-то на каждом узле, но вы этого не знаете, это почти похоже на указатель NULL. Есть ли еще одно творческое решение для этого?
Примечание: Я использую C++ 03.
К ОП: Пожалуйста, поймите, что это хрупкий код. Как только вы вводите тип 'C' в качестве подтипа' A', вам понадобится другое предложение 'if'. Именно в этом и заключается причина использования полиморфизма. –
Думаю, мне нужно будет увидеть больше намерения OP знать, согласен ли я с этим утверждением. Если C происходит от B, нет необходимости в дополнительной инструкции if. Если мы хотим вызывать другой метод для C, чем для B, нам нужен оператор if независимо. –