Указатель на класс и функцию - проблема - PullRequest
1 голос
/ 13 января 2010

Сначала я покажу вам несколько классов.

class A {
public:
    B * something;

    void callSomething(void) {
        something->call();
    }
};

class B {
public:
    A * activeParent;

    B(A * parent) {
        activeParent = parent;
    }

    void call(void) {
        activeParent->something = new C;
    }
};

class C : public B {
public:
    A * activeParent;

    C(A * parent) {
        activeParent = parent;
    }

    void call(void) {
        // do something
    }
};


A * object;
object = new A;
object->something = new B;
object->callSomething();

Моему приложению нужна такая структура. Когда я делаю callSomething (), он вызывает call's () B, но когда call () B изменяет «что-то» на C, вызывается call () C, и я хочу этого избежать. Как мне быть?

1 Ответ

1 голос
/ 14 января 2010

Помимо проектных решений (например, циклические зависимости) ...

Единственная причина, по которой метод callSomething () A вызывает метод C call () из указателя на B, заключается в том, что метод call () виртуальный. Чтобы не вызывать метод C call (), вот несколько вариантов:

  • Не делать метод call () виртуальным
  • Переименование одного из методов call () B или C (предпочтительнее, чем первый вариант)
  • Вызовите метод call () явно

Чтобы вызвать метод call () B явно:

void callSomething(void) {
    something->B::call();
}
...