【问题标题】:In Inheritance: Can I override base class data members?在继承中:我可以覆盖基类数据成员吗?
【发布时间】:2017-08-08 02:23:49
【问题描述】:

假设我有两个类,如下所示:

Class A
{
public:
..
private:
  int length;
}

Class B: public Class A
{
public:
..
private:
 float length;
}

我想知道的是:

  1. 是否允许覆盖基类数据成员
  2. 如果是,这是一个好的做法吗?
  3. 如果不是,扩展类数据成员类型的最佳方法是什么?

有一个类满足我的需求,我想重用它。但是对于我的程序需要,它的数据成员应该是另一种类型。

我有一些书,但它们都只涉及基类成员方法的覆盖。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您可以使用模板化成员,即通用成员,而不是覆盖成员。

    您还可以声明一个 VARIANT(COM) 之类的 union。

       struct MyData
       {
            int vt;              // To store the type
    
            union 
            {                
                LONG      lVal;
                BYTE      bVal;
                SHORT     iVal;
                FLOAT     fltVal;
                .
                .
            }
       };
    

    【讨论】:

    • 如果你想为某个类提供更多功能(类似于子类化),他可以使用模板专业化吗?
    • 这在技术上并不是压倒一切的;)
    • 如果成员对于他的情况是通用的,则无需覆盖成员。此外,覆盖成员是一种不好的做法。
    • 完全同意(见下面我的回答)。改变数据成员的含义是失败的。但是创建模板实例并没有覆盖 :)
    【解决方案2】:

    1) 不,你不能。您可以创建自己的内部/隐藏/私有成员,但不能覆盖它们。

    2) 如果可以的话,这不是一个好习惯。想想看;)

    3) 你不应该这样做,因为你正在改变成员的含义。

    【讨论】:

    • 想想虚函数:你不是在改变调用的含义吗?但是,我仍然同意你的看法;函数被限定,但成员被使用。
    • 我同意根据类型重新定义行为。我不同意改变数据项的基本含义。 :)
    【解决方案3】:

    虽然在派生类中声明同名数据成员是合法的 C++,但它可能不会达到您的预期。在您的示例中,A 类中的任何代码都无法看到 float length 定义 - 它只能访问 int length 定义。

    在 C++ 中只有方法可以具有虚拟行为,数据成员不能。如果您想使用其他数据类型重用现有类,则必须使用所需的数据类型重新实现该类,或者将其重新实现为模板,以便在实例化时提供所需的数据类型。

    【讨论】:

      【解决方案4】:

      1) 是的,它是允许的,就像你可以做到的那样

      2) 不!不好的做法。如果有人调用使用 'length' 的方法,则返回的变量将是未定义的。

      3) 尝试不同的设计。也许您想拥有一个类似命名的函数或将基类用作“has-a”类而不是“is-a”类。

      【讨论】:

      • 请解释你对no的回答之间的矛盾。 1 和@OJ 的answer
      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多