2011-07-13 97 views
1

对我来说,描述我的问题是相当困难的。 我有两个班,我会说​​和Derived_A。您可以从名称中看到,类Derived_A源自​​。另外在我的程序中,我还有其他两个类Base_BDerived_B(也有继承)。类​​包含Base_B的对象,而类Derived_A包含Derived_B的对象。C++继承指针

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

如何看到A的每个类有一个B类对象和指向此对象的指针。我的问题是,当我调用功能print()时,它不需要Derived_B* pointer_,但尝试访问Base_B* pointer_,这是不存在的。我怎么能在我的程序中说,它应该根据班级采取指针?或者我需要declarate内Derived_A类像Base_B* pointer_

Base::pointer_ = pointer_; 

也许是有我的问题的其他方法或算法?

非常感谢。

+0

你可以创建一个虚函数来返回适当的指针。你知道Derived_A有两个'pointer_'s吗? –

+0

是的,我知道Derived_A有两个指针。这只是一个例子。在真正的程序中,这个指针有不同的名字。关于你的想法。你的意思是说,我需要一个函数返回一个类B的指针,并将该指针指向函数print()? –

+0

或者直接将该方法调用到print()中。您也可以使虚拟打印并在派生类中重写它。我不知道你在做什么。 –

回答

3

“但尝试访问Base_B* pointer_,这是不存在的”

如果DerivedA不正确初始化BaseA,然后DerivedA不符合“ISA”的继承和规则的设计需要改变。在脸上的东西:

  1. 不要重复使用在派生类中,如b_pointer_名。 它只是混淆,你没有任何价值。
  2. 使init()为虚拟。
  3. 已经DerivedA :: init()显式调用BaseA :: init()。
  4. 使pointer_成为虚拟方法。

请注意,对于虚拟方法使用“协变返回类型”。

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

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

如果Base_A :: init()被调用过,Base_A不会有指向Base_B的指针吗? 你为什么不启动基类?

+0

当我初始化()类Derived_A时,我更多地考虑覆盖Base_B * pointer_的值。像我一样可以重写继承中的虚函数。或者,也可以使用指针_的模板,可以有不同的类型。但我不知道如何。 –