C++ 你能';重新申报';子类中的变量?
是否可以声明成员是基类成员的子类 例如C++ 你能';重新申报';子类中的变量?,c++,C++,是否可以声明成员是基类成员的子类 例如 基本上,Bar总是让baz成为B,我想要两样东西:一种展示/实施这一点的方式,以及避免每次在Bar中使用baz时都必须使用它。我的直觉是这是不可能的,但我不想成为C++专家。 < p>你不能在C++中重新命名任何名字,但这里不是。在Bar中,baz是默认值,带有: baz 或 您可以通过以下方式访问Foo: Foo::baz ypu看到它们有自己的作用域,因此有唯一的名称。这取决于baz如何在Foo中初始化。这是一个可能的解决方案: class F
基本上,Bar总是让baz成为B,我想要两样东西:一种展示/实施这一点的方式,以及避免每次在Bar中使用baz时都必须使用它。我的直觉是这是不可能的,但我不想成为C++专家。 < p>你不能在C++中重新命名任何名字,但这里不是。在
Bar
中,baz
是默认值,带有:
baz
或
您可以通过以下方式访问Foo
:
Foo::baz
ypu看到它们有自己的作用域,因此有唯一的名称。这取决于
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); }
}
class-Foo{
受保护的:
A*baz;
公众:
Foo():baz(新A){}
Foo(A*baz_uuz){}
//需要dtor、copy ctor、copy assign运算符,但为简洁起见已跳过
}
酒吧类别:富{
公众:
Bar():Foo(新B){}
私人:
//使用此选项以B的形式访问baz*
B*baz(){return static_cast(Foo::baz);}
}
在这里,智能指针比原始指针更可取。您不能。只能重新声明虚拟函数的返回类型
class Foo {
virtual A *baz();
};
class Bar : public Foo {
B *baz();
};
听起来模板可能是一个解决方案;i、 e.
类Foo{T*baz;};类栏:Foo{…}
@OliCharlesworth您应该将您的评论作为答案。它看起来是目前为止最好的解决方案。@OliCharlesworth,这将丢失Foo和Bar之间的继承关系。@zmbq:绝对正确。但不清楚这是否重要。baz是偶然私有的吗?@Oktalist有道理,您可以重写方法,返回类型不是函数签名的一部分。@chacham15但返回类型必须兼容。例如,如果Foo::baz
返回double
和Bar::baz
返回int
,则其格式将不正确。
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); }
}
class Foo {
virtual A *baz();
};
class Bar : public Foo {
B *baz();
};