Внутренний вызов декорированной функции в конкретной реализации абстрактного класса - PullRequest
0 голосов
/ 30 марта 2020

У меня есть еще один вопрос по оформлению классов C ++. С декораторами меняю функцию virtual int get(). Но в классе NP C я также вызываю функцию get(), чтобы получить некоторые значения для расчета. Есть ли способ вызвать Elite :: get () внутри NP C. Я хочу получить 100, а не 10. Спасибо.

class AbstractNPC {
public:
    virtual int get() = 0;
};

class NPC: public AbstractNPC {
public:
    NPC() { }
    int get(){ return 10; }
    calc(){ int i = get(); }
};

class NPCDecorator: public AbstractNPC {
private:
    AbstractNPC * npc;
public:
    NPCDecorator(AbstractNPC *n) { npc = n; }
    int get() { npc->get(); }
};

class Elite: public NPCDecorator {
public:
    Elite(AbstractNPC *n): NPCDecorator(n) { }
    int get() { return 100; }
};

Или есть способ получше? Может быть использование указателей на функции?

1 Ответ

1 голос
/ 30 марта 2020

Вы можете просто использовать наследование:

class Elite: public NPC {
public:
    int get() { return 100; }
};

Посмотрите это онлайн!


get() Метод полиморфный c. Это означает, что компилятор будет знать, должен ли он вызывать Elite::get или NPC::get, независимо от того, где вы его называете. Вы должны быть осторожны с , используя виртуальные методы в конструкторах или деструкторах , но в остальном все должно работать правильно.

...