你可以重新宣布'子类中的变量?

时间:2014-04-20 19:56:37

标签: c++

是否可以声明成员是基类成员的子类?

E.g。

class A {
    int a;
}

class B : A {
    int b;
}

class Foo {
   A *baz;
}

class Bar : Foo {
   B *baz; //How can I not shadow baz, but 'redeclare' it as a B?
}

基本上,Bar总是让baz成为B并且我想要两件事:一种展示/执行这一点的方式,并且避免每次在Bar中使用它时都必须抛出baz。我的直觉是,这是不可能的,但我并不打算成为C ++专家。

3 个答案:

答案 0 :(得分:4)

你做不到。您只能重新声明虚函数的返回类型。

class Foo {
   virtual A *baz();
};

class Bar : public Foo {
   B *baz();
};

答案 1 :(得分:2)

具体取决于bazFoo的初始化方式。这是一个可能的解决方案:

class Foo {
protected:
   A *baz;

public:
   Foo() : baz(new A) {}
   Foo(A *baz_) : baz(baz_) {}
   // dtor, copy ctor, copy assign operator required but skipped for brevity
}

class Bar : Foo {
public:
   Bar() : Foo(new B) {}

private:
   // use this to access baz as a B*
   B *baz() { return static_cast<B*>(Foo::baz); }
}

智能指针优先于原始指针。

答案 2 :(得分:0)

你不能在C ++中“重新声明”任何名称,但在这里你不是。在Bar内,baz是默认值:

 baz

 Bar::baz

你可以通过以下方式进入Foo

 Foo::baz

ypu看到他们有自己的范围,因此有独特的名称。