Как получить доступ к локальным переменным в производном классе с унаследованными функциями в C ++ - PullRequest
0 голосов
/ 03 февраля 2020

Как мне получить доступ к локальной переменной производного класса с помощью функции-члена базового / унаследованного класса?

Я исходил из перспективы JavaScript, и хотя у меня есть некоторый опыт Java, это был пока. Вот желаемый результат в JavaScript.

// JavaScript Example

class State {
    constructor(name){
        this.name = name || "Parent";
    }

    getName(){ return this.name };
}

class StateReading extends State {
    constructor(){
        super("Child");
    }

    // Since StateReading extends State, it also inherits its parent's functions
    // in this case, it inherits getName()

}

const s = new StateReading();
console.log(s.getName());   // I print out "Child"

Я пытаюсь сделать что-то похожее с C ++, но у меня есть время, чтобы собрать все биты (хар хар), чтобы выстроиться в линию.

#include <iostream>
using namespace std;


 class State {
    std::string name = "Parent";

    public: 
        virtual std::string getName() {  // "virtual" keywords removes the compile time linkage
            return name;
        }
 };

 class StateReading : public State {
     std::string name = "Child";
 };


int main() {

    StateReading sr = StateReading();
    State* s = &sr;  // Make state a pointer to a memory address so it can be reused

    cout<<s -> getName(); // Prints "Parent" ... but I'm pointing to StateReading's memory address ... :/
    cout<<sr.getName(); // At least this one should be child ... wait, it's "Parent" too?!
    return 0;
}

Единственный способ заставить это работать - переопределить getName () в дочернем классе. Но я действительно не хочу переопределять каждый метод в дочернем классе. Я пытаюсь работать с концепцией полиморфизма с заводским паттерном. Я знаю, что всегда буду создавать какое-то «Состояние», но это может быть любой из ряда производных классов.

// Untested example
class StateFactory{

  public: 
    static make(params){
        switch(params) {
            case 0: return StateReading();
            case 1: return StatePaused();
            case 2: return StateWriting();
            default: // etc.
        }
    }
}


State state = StateFactory.make(params);
state.getName();  // prints out the state's name.  

Есть какие-нибудь мысли по этому поводу? Кажется, что переопределение каждого производного класса для получения локальных переменных экземпляра было бы настоящим кошмаром обслуживания.

1 Ответ

1 голос
/ 03 февраля 2020

В JS вы вызываете конструктор базового класса. Сделайте то же самое в C ++

#include <iostream>
using namespace std;


 class State {
 public:
    State() = default;
    State(const std::string &n) : name(n) {}
    virtual ~State() = default;

    std::string getName() {
        return name;
    }
 private:
    std::string name = "Parent";
 };

 class StateReading : public State {
 public:
     StateReading() : State("Child") {}
 };


int main() {

    StateReading sr = StateReading();
    State* s = &sr;  // Make state a pointer to a memory address so it can be reused

    cout<<s -> getName(); // Prints "Parent" ... but I'm pointing to StateReading's memory address ... :/
    cout<<sr.getName(); // At least this one should be child ... wait, it's "Parent" too?!
    return 0;
}

Вам не нужен метод virtual, потому что вы не переопределяете его, но вы должны определить виртуальный деструктор: Когда использовать виртуальные деструкторы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...