используя члены данных производного класса из метода базового класса - PullRequest
1 голос
/ 15 мая 2019

Итак, я пытался использовать производные члены класса из базового класса, и я не могу понять, как это сделать. Я вижу способ сделать это путем простой передачи нужного мне члена в параметре, когда я вызываю метод базового класса, но я просто думал, что должен быть другой способ сделать это. Поэтому я повторил это, как показано ниже.

#include<iostream>
using namespace std;
class B;
class A{
    public:
    display(){
        cout<<cord<<endl;
    }
    int cord = 25;
};

class B : public A{
    public:
    B(){
        A a;
        a.display();
    }
    int cord = 30;
};

class C : public A{
    public:
    C(){
        A a;
        a.display();
    }
    int cord = 35;
};

int main(){
    B b;
    C c;
    B.display();

}

Вышеприведенный код дает вывод как

25
25
25

То, что я хочу выдать, это

30
35
30

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

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

определить виртуальный геттер как

virtual int getCord() const { return cord; }

в каждом классе и назовите его в Дисплей

void display(){ cout << getCord() <<endl; }

и в конструкторе B и C вам также необходимо заменить

A a;
a.display();

просто

display();

иначе нет никакого шанса, что вы получите доступ к значению подклассов, явно вызывающих display в экземпляре A


с использованием членов данных производного класса из метода базового класса

Это потому, что я позволил переопределить шнур в B и C, но я не рекомендую вам делать такое переопределение в «реальных» кодах; -)

2 голосов
/ 15 мая 2019

Давайте возьмем конструктор B:

B(){
    A a;
    a.display();
}

В нем вы создадите совершенно отдельный объект a типа A и вызовете для него display.Этот вызов display будет использовать объект a, вообще ничего не зная о классе B или его полностью отдельной переменной-члене cord.

Один из возможных способов решить эту проблему - создатьконструктор A, который принимает значение cord в качестве аргумента, передает «правильное» значение в список инициализатора конструктора B, а затем вызывает функцию display для этого объекта:

struct A{
    A() = default;

    explicit A(int c)
        : cord(c)
    {
    }

    display(){
        cout<<cord<<endl;
    }

    int cord = 25;
};

struct B : A{
    B()
        : A(30)
    {
        display();  // Equivalent to this->display();
    }
};

Конечно, вы должны сделать что-то подобное для класса (или структуры) C.

Обратите внимание, что я удалил переменную-член cord из B учебный класс.Это потому, что если вы объявите новую переменную-член с тем же именем, что и переменная-член в базовом классе, то вы фактически создадите совершенно новую переменную-член, которая не связана с той, что в родительском классе.И для простого примера, который вы показываете, нет необходимости «переопределять» переменную-член, так как она уже существует во всех дочерних классах.

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