Nnnnn
Nnnnn

Reputation: 133

using derived class data members from base class method

So i have been trying to use derived class data members from the base class and i am not able to figure out how to do that. I see a way to do this as just passing the member i need in parameter when i call the base class method but i was just thinking that there should be another way to do that. So i have replicated this as below.

#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();

}

The above code as giving output as

25
25
25

What i want it to give out is

30
35
30

Every way to do this will be appreciated, whatever is better and if you want to me add something or anything ask in comments, i'll do right away.

Upvotes: 1

Views: 1975

Answers (2)

Some programmer dude
Some programmer dude

Reputation: 409136

Lets take the B constructor:

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

In it you create a completely separate object a of type A, and call display on it. That display call will be using the a object, not knowing anything about the B class or its totally separate cord member variable at all.

One possible way to solve this is to create a constructor of A that takes the value of cord as an argument, pass the "correct" value in the B constructor initializer list, and then call the display function on this object:

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();
    }
};

Of course, you need to do something similar for the C class (or structure).

Note that I removed the member variable cord from the B class. That's because if you declare a new member variable with the same name as a member variable in a base class, then you effectively create a completely new member variable that is unrelated to the one in the parent class. And for the simple example you show there's no need to "override" the member variable, as it already exists in all child-classes as well.

Upvotes: 2

bruno
bruno

Reputation: 32586

define a virtual getter like

virtual int getCord() const { return cord; }

in each class and call it in display

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

and in the constructor of B and C you also need to replace

A a;
a.display();

just by

display();

else there is no chance you access to the value of the sub classes explicitly calling display on an instance of A


using derived class data members from base class method

This is because of that I let the redefinition of cord in B and C, but I do not recommend you to do that kind of redefinition in 'real' codes ;-)

Upvotes: 3

Related Questions