是否可以声明成员是基类成员的子类?
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 ++专家。
答案 0 :(得分:4)
你做不到。您只能重新声明虚函数的返回类型。
class Foo {
virtual A *baz();
};
class Bar : public Foo {
B *baz();
};
答案 1 :(得分:2)
具体取决于baz
中Foo
的初始化方式。这是一个可能的解决方案:
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看到他们有自己的范围,因此有独特的名称。