C++ C+中的变量重写+;

C++ C+中的变量重写+;,c++,overriding,C++,Overriding,考虑以下代码 class Base1 { public: void func1(float x) {var1 = x;} private: float var1; }; class Derived1: public Base1 { public: void func1(int x) {var1 = x;} private: int var1; }; 使用新的数据类型(本例中为整数)重新定义变量var1是一个好主意吗?这有什么问题吗?(例如:阴影!)一般来说,用一

考虑以下代码

class Base1
{
public:
  void func1(float x)
  {var1 = x;}

private:
  float var1;
};


class Derived1: public Base1
{
public:
  void func1(int x)
  {var1 = x;}

private:
  int var1;
};

使用新的数据类型(本例中为整数)重新定义变量var1是一个好主意吗?这有什么问题吗?(例如:阴影!)

一般来说,用一个同名的新变量替换父变量可能会让人感到困惑和容易出错

在您的示例中,不仅变量被替换,设置它的函数也被替换为“名称隐藏”(您将其称为“阴影”)

似乎您不喜欢父级的属性(可能还有行为),这可能是您的类层次结构应该重新审视的信号


您可以阅读“名称隐藏”作为语言特性的基本原理

可能不是一个好主意,但在这里也不是有害的。您可以在
Base1
类的
protected
部分中设置
int var1
,然后可以从
Derived1
访问它。您的示例中的基本字段无论如何都是私有的……隐藏不是重写的。
var1
引用的变量将取决于使用它的上下文。在方法重写中,派生类的方法将始终是使用的方法,除非使用
Base::
显式限定它,因为它是一个私有变量,所以在派生类中不可见。就派生类设计而言,它也可能不存在。这两个类中的私有成员变量之间没有关系。谢谢你的回答。但是基类中的变量被故意选择为“private”,这样在派生类中就无法访问该变量。因此我认为,它不应该在派生类中造成任何混乱。