c++继承指针

c++ inheritance pointer

本文关键字:指针 继承 c++      更新时间:2023-10-16

我很难描述我的问题。我有两个类,我会说Base_ADerived_A。从名称可以看出,Derived_A类是由Base_A派生而来的。同样在我的程序中,我还有另外两个类Base_BDerived_B(也有继承)。类Base_A包含Base_B的对象,类Derived_A包含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;
}

你可以看到A的每个类都有一个B类的对象和指向这个对象的指针。我的问题是,当我调用函数print()时,它不需要Derived_B* pointer_,而是尝试访问不存在的Base_B* pointer_。我怎么能在程序中说,它应该根据类获取指针呢?或者我需要在Derived_A类中声明Base_B* pointer_,如:

Base::pointer_ = pointer_;

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

非常感谢。

"但尝试访问Base_B*指针_,该指针不存在"

如果DerivedA没有正确初始化BaseA,则DerivedA不符合继承的"isA"规则,设计需要更改。从表面上看:

  1. 不要在派生类中重用b_pointer_这样的名字。它只是令人困惑,你没有获得任何价值。
  2. 设置init()为虚拟的。
  3. 让DerivedA::init()显式调用BaseA::init()
  4. 设置指针为虚方法。

注意,虚方法使用了"协变返回类型"。

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

如果Base_A::init()被调用,Base_A不会有一个指向Base_B的指针吗?为什么不初始化基类呢?