我在下面有一个代码片段:
#include <iostream>
using namespace std;
class Base {
public:
Base() : b(0) {}
int get();
virtual void sayhello() { cout << "Hello from Base with b: " << b << endl; }
private:
int b;
};
int Base::get() {sayhello(); return b;}
class Derived : public Base {
public:
Derived(double b_):b(b_){}
void sayhello() { cout << "Hello from Derived with b: " << b << endl; }
private:
double b;
};
int main() {
Derived d(10.0);
Base b = d;
cout << "Derived b: " << d.get() << endl;
cout << "Base b: " << b.get() << endl;
}
运行编译后的可执行文件,我发现结果在我的llvm-g++ 4.2机器上超出了我的预期。我的盒子上的输出是
Hello from Derived with b: 10
Derived b: 0
Hello from Base with b: 0
Base b: 0
我想要在代码中做的是覆盖类b
中的成员字段()Derived
。由于我认为两者都Base
需要Derived
访问该字段,所以我在 中定义了一个get
成员函数Base
,因此Derived
可以继承它。然后我尝试从不同的对象中获取成员字段。
结果表明我仍然得到原始b
的 in Base
byd.get()
而不是 in Derived
,这是我期望代码做的。代码(或我的理解)有什么问题吗?规范中是否指定了此行为?覆盖成员字段并正确定义其 getter 和 setter 的正确方法是什么?