1

it's pretty diffecult for me to describe my problem. I have two classes, I would say Base_A and Derived_A. You can see from the names, the class Derived_A is derived from Base_A. Also in my program I have other two classes Base_B and Derived_B (also with inheritance). The class Base_A contains the object of Base_B, and the class Derived_A contains the object of Derived_B.

class Base_A {
public:
    Base_A() {}
    virtual ~Base_A() {}

    Base_B b_;
    Base_B* pointer_;

    void init() {
        b_ = Base_B();
        pointer_ = &b_;
        pointer_->setValue(1);
    }

    void print() {
        pointer_->getValue();

    }
};

class Derived_A: public Base_A {
public:
    Derived_A() {}
    virtual ~Derived_A() {}

    Derived_B b_;
    Derived_B* pointer_;

    void init() {
        b_ = Derived_B();
        pointer_ = &b_;
        pointer_->setValue(2);
        pointer_->increaseValue();
    }
};

class Base_B {
public:
    Base_B() {}
    virtual ~Base_B() {}

    int value_;

    void setValue(int value) {
        value_ = value;
    }

    void getValue() {
        cout << "Base_B: " << value_ << endl;
    }
};

class Derived_B: public Base_B {
public:
    Derived_B() {}
    virtual ~Derived_B() {}

    void increaseValue() {
        value_++;
    }
};

int main() {  
    Derived_A derived_A = Derived_A();
    derived_A.init();
    derived_A.print();

    return 0;
}

How you can see every class of A has one object of class B and pointer to this object. My problem is, when I call the function print(), it does not take Derived_B* pointer_, but try to access Base_B* pointer_, which is not exist. How I can say in my program, that it should take the pointer according to the class? Or do I need to declarate the Base_B* pointer_ inside the Derived_A class like:

Base::pointer_ = pointer_;

Maybe is there other method or algorithm for my problem?

Thank you a lot.

4
  • you could create a virtual function that returns the appropriate pointer. Are you aware that Derived_A has two pointer_s ? Commented Jul 13, 2011 at 1:06
  • yes, I know that Derived_A has two pointers. It was just an example. In the real program, this pointers have different names. And about your idea. Do you mean, that I need the function that return me a pointer of class B and than give this pointer to function print()? Commented Jul 13, 2011 at 1:10
  • Either that or directly put that method call in print(). You could also make print virtual and override it in the derived class. I have no idea what you're trying to do. Commented Jul 13, 2011 at 1:14
  • As a further remark, I also doubt whether BaseA should contain a BaseB. This means that DerivedA contains TWO BaseB's, one the base class and one in the DerivedB member. I'd look at creating an abstract base class; Cf. Meyer's recommendation on "make non-leaf classes abstract". Commented Jul 13, 2011 at 1:24

2 Answers 2

3

"but try to access Base_B* pointer_, which is not exist"

If DerivedA does not properly initialise BaseA, then DerivedA does not meet the "isA" rule for inheritance and the design needs changed. On the face of things:

  1. Don't re-use names in the derived class such as b_, pointer_. Its just confusing and you gain no value.
  2. Make init() virtual.
  3. Have DerivedA::init() call BaseA::init() explicitly.
  4. Make pointer_ a virtual method.

Note the use of "covariant return types" for the virtual methods.

class BaseA
    {
    public:
       virtual BaseB* pointer() { return &b_; }
       // etc.
    };

class DerivedA : public BaseA
    {
    public:
       virtual DerivedB* pointer() { return &b_; }
       // etc.
    };
Sign up to request clarification or add additional context in comments.

Comments

0

wouldn't Base_A have a pointer to Base_B if Base_A::init() was ever called? why wouldn't you init the base class?

1 Comment

I thought more about to override the value Base_B* pointer_, when I init() the class Derived_A. The same like I can override the virtual function in inheritance. Or maybe use Templates that the pointer_, can have different types. But I don't know how exactly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.