类继承的 C++ 问题

Ole*_*exy 4 c++

我有一些变量和函数的基类以及多个子类。我想尽可能减少子类中所需的代码量。

我的代码示例:

#include <iostream>

class base{
public:
   int a = 10;
   int b;
   void print()
   {
      std::cout << a <<std::endl;
   }
};

class child: public base
{
   public:
      int a;
};

int main()
{
    child ch;
    ch.a = 20;
    ch.print();

}
Run Code Online (Sandbox Code Playgroud)

由于打印了结果编号 10,这意味着使用了基类变量a,但我需要使用子类变量(如果存在)。所以这个例子的预期输出是 20。

Jos*_*son 6

在子类中覆盖基类中的变量是一个重大错误。这会非常惊人地反咬你。

发生的事情是 ch.a 来自子类(被覆盖的版本),但打印函数是基类的一部分,因此它将打印该版本。

如果有某种原因要这样做(我想不出一个原因),那么您可以在分配之前将 ch 类型转换为基类。像这样的东西:

(static_cast<base>(ch)).a = 20;
Run Code Online (Sandbox Code Playgroud)

但更好的选择是永远不要重载变量名。

  • @JosephLarson 这可能是一个“好主意”,纯粹是因为它们是不同的范围,并且我在“child”中所做的事情不应受到“base”的实现细节的影响。我有一个(诚然,特殊)情况,我从一个类继承,并且需要存储一个最好描述为“路径”的成员。在这种情况下,这是该成员的完美名字。唉,基类*也*有一个具有该名称的成员。但谁在乎?这两个成员从不交叉。事实上,基类成员是“private”,我知道它的唯一原因纯粹是偶然。 (3认同)