【发布时间】:2013-08-17 11:13:07
【问题描述】:
假设我有一个类Foo,它的实现涉及一个大对象。我想扩展Foo的功能,所以我决定写一个继承Foo的类Bar:
class Foo {
protected:
int bigobject;
public:
Foo() : bigobject(1) { }
int get() { return bigobject; }
void set(int x) { bigobject = x; }
};
class Bar : public Foo {
public:
Bar(Foo& f) { /* ??? */ }
void multiply(int factor) { bigobject *= factor; }
};
如您所见,我将构造函数留空。这是因为我想做的是让任何Bar 对象的基本成员引用现有Foo 实例的成员。换句话说,我想要代码:
Foo f;
f.set(5);
std::cout << "f is " << f.get() << std::endl;
Bar b(f);
std::cout << "b is " << b.get() << std::endl;
b.multiply(2);
std::cout << "b is " << b.get() << std::endl;
std::cout << "f is " << f.get() << std::endl;
结果:
f is 5
b is 5
b is 10
f is 10
这样f 和b 的基本部分共享相同的内存空间。这是为了避免在我想实例化Bar 的任何时候复制bigobject。用非正式的术语来说,我希望 Bar 对象 b 成为 Foo 对象 f 的“视图”。调用Foo 的任何成员方法都会改变f,但我也可以定义更多方法作为Bar 的一部分,这也会改变f。
现在,我可以这样声明一个全局“存储”变量:
int bigobject_storage = 1;
class Foo {
protected:
int& bigobject;
public:
Foo() : bigobject(bigobject_storage) { }
int get() { return bigobject; }
void set(int x) { bigobject = x; }
};
class Bar : public Foo {
public:
void multiply(int factor) { bigobject *= factor; }
};
为了获得我想要的功能,但这似乎很骇人听闻并且泄露了实现。那么,有没有一种惯用的 C++ 方法来实现这一点?
【问题讨论】:
标签: c++ oop inheritance