在继承中:我可以覆盖基类数据成员吗?

时间:2009-02-02 00:25:21

标签: c++

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

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

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

我想知道的是:

  1. 是否允许覆盖基类数据成员
  2. 如果是,这是一个好习惯吗?
  3. 如果不是,扩展类数据成员类型的最佳方法是什么?
  4. 有一个类可以满足我的需求,我想重用它。但是,对于我的程序需求,其数据成员应该是另一种类型。

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

4 个答案:

答案 0 :(得分:7)

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

你也可以像工会一样声明VARIANT(COM)。

   struct MyData
   {
        int vt;              // To store the type

        union 
        {                
            LONG      lVal;
            BYTE      bVal;
            SHORT     iVal;
            FLOAT     fltVal;
            .
            .
        }
   };

答案 1 :(得分:3)

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

2)如果可以,那不是一个好习惯。想一想;)

3)你不应该,因为你正在改变成员的意思。

答案 2 :(得分:3)

虽然在派生类中声明具有相同名称的数据成员是合法的C ++,但它可能不会按照您的意图执行。在您的示例中,A类中的任何代码都无法查看float length定义 - 它只能访问int length定义。

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

答案 3 :(得分:0)

1)是的,允许,你可以这样做

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

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