你能在子类中'redeclare'变量吗?

Can you 'redeclare' a variable in a subclass?

本文关键字:变量 redeclare 子类      更新时间:2023-10-16

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

例如

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

基本上,酒吧总是会让baz是B,我想要两件事:一种展示/执行这一点的方式,同时避免每次在酒吧使用baz时都必须铸造baz。我的直觉是这是不可能的,但我并不声称自己是C++专家。

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

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

这取决于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); }
}

智能指针比原始指针更可取。

您不能在C++中"重新声明"任何名称,但现在不能了。在Bar中,baz是默认值,带有:

 baz

 Bar::baz

然后你用到达Foo

 Foo::baz

ypu认为它们有自己的作用域,因此有唯一的名称。