'重写'班级成员

时间:2017-07-18 15:18:24

标签: c++ class polymorphism

快速问题:我有一个带有成员变量的基类,我试图覆盖'派生类中的此值。我该怎么做呢?

我试过了:

class A
{
public:
    double i = 1;
};

class B : public A
{
public:
    double i = 2;
};


int main(int argc, char** argv)
{
    B* b = new B();
    A* a = b;
    std::cout << b->i << '\t' << a->i << std::endl;  // output 2    1
}

但所需的输出是“2 2&#39;”。 我做错了什么?

谢谢,

尼古拉斯

2 个答案:

答案 0 :(得分:1)

您可以覆盖虚拟功能;您无法覆盖数据成员。此类层次结构有两个名为i不同成员,一个在A类中,另一个在类B中。

如果希望派生类更改基类中i的值,只需在构造函数中执行:B() { i = 2; }。但更好的方法是让A的构造函数设置i的值,并从B调用它:

A::A(int ii = 1) : i(ii) {}
B::B() : A(2) {}

答案 1 :(得分:0)

甚至比Pete提出的解决方案还要简单。

只需像这样定义你的B类:

class B : public A
{
public:
    B() { i = 2; }
}

因此,B类将重用其基础(A)中定义的成员,其默认值将“覆盖”为2,因此您的测试代码将返回“2 2”。

这就是你如何1)不改变基类A(不要用默认值添加那个不必要的int参数,有些人甚至说使用默认值的函数参数是c ++中的坏习惯)和2)不要在你的类中添加虚拟函数的开销(这在简单的代码中也是不必要的)。