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();
};