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

класс B: я нахожусь в сценарии такого типа в моем проекте, где я нахожусь в x() функции базы class A и мне нужен доступ к данным y из производных class C. Я объявил объект производного class C и, используя obj_c, получил функцию x()

class A
{
private :
    public :
    //.....
    void x()
    {
        cout << y ;
    }
    //.....
};

class B : public A
{
public :
    //.....
protected :
    //.....
private :
    //.....

};
class C : public B
{
public :
    //.....
protected :
    int y = 10 ;
private :

    //.....

};
int main()
{
    C obj_c ;
    obj_c.x();
}


Ответы [ 3 ]

0 голосов
/ 18 января 2020

Поскольку C наследует от B, а B наследует от A, то сделайте функцию виртуальной в классе. реализовать его в C и вызвать его напрямую.

0 голосов
/ 19 января 2020

Идея базового класса заключается в том, что A может использоваться, даже если C не существует. Так где же A собирается получить y?

В этих случаях вы используете шаблонный метод шаблон проектирования:

A предполагает, что наследование классы будут предоставлять y, требуя, чтобы они реализовали метод get_y():

#include <iostream>

class A
{
    private :
    protected:
        virtual int get_y() = 0;
    public :
        //.....
        void x()
        {
            std::cout << get_y() << std::endl;
        }
        //.....
};

class B : public A
{
    public :
        //.....
    protected :
        //.....
    private :
        //.....

};
class C : public B
{
    public :
        //.....
    protected :
        int get_y()
        {
            return 10;
        }
    private :

        //.....

};
int main()
{
    C obj_c ;
    obj_c.x();
}
0 голосов
/ 18 января 2020

Поместите объявление y внутри базового класса. В конце концов, так, как вы написали свой код, A должен содержать ay для функционирования.

Производный класс может затем присвоить значение, передав его до A при построении.

class A {
public:
   void x() { cout << y; };

protected:
   A(int value) : y(value) {} 
   int y;
}

class B : public A
{
protected:
    B(int value) : A(value) {}
}

class C : public B
{
public:
    C() : B(10) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...