C ++:子类成员的“升级”指针类型

时间:2018-08-03 21:27:25

标签: c++ templates polymorphism

假设我具有以下类层次结构:

class A {
    int x;
};

class B : public A {
    float y;
};

class Foo {
    A* obj;
};

class Bar : public Foo {
    B* obj; // I want this to override "obj" in the superclass!
};

我知道Bar将遮盖超类obj的{​​{1}},而实际上Foo将具有两个字段。但是我真正想要的是,如果某些代码能够看到类型为Bar的对象,他们还可以假定其指针Bar*指向类型为obj的指针。我该怎么做?

我想到了两种方法:

  1. 将模板添加到B,以指定其指针的类型。然后,将Foo改写为Bar。这样会增加模板,而且可能很丑。
  2. 使成员受到保护,在Bar : public Foo<B>中添加将Bar强制转换为obj的getter,并确保(在构造函数,setter等)中,B*仅设置为obj类型。这很不雅致,因为它不是真正的编译时,需要强制转换。

是否有没有上述缺点的更好的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试一下:

class A {
    int x;
};

class B : public A {
    float y;
};

class Foo {
protected:
    A* obj;
};

class Bar : public Foo {
    B* obj; // I want this to override "obj" in the superclass!

public:
    void edit_foo_obj(A* n_obj) {
        Foo::obj = n_obj;
    }

    void edit_bar_obj(B* n_obj) {
        this->obj = n_obj;
    }
};

int main()
{
    Bar b;
    A a;
    B ba;

    b.edit_bar_obj(&ba);
    b.edit_foo_obj(&a);

    return 0;
}