快速问题:我有一个带有成员变量的基类,我试图覆盖'派生类中的此值。我该怎么做呢?
我试过了:
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;”。 我做错了什么?
谢谢,
尼古拉斯
答案 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)不要在你的类中添加虚拟函数的开销(这在简单的代码中也是不必要的)。