假设我有一个类Foo
,其实现涉及一个大对象。我想扩展 的功能Foo
,所以我决定编写一个Bar
继承的类Foo
:
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
和base部分b
共享同一个内存空间。这是为了避免bigobject
在我想实例化Bar
. 用非正式的术语来说,我希望一个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; }
};
为了获得我想要的功能,但这似乎很hackish并且泄漏了实现。那么,有没有一种惯用的 C++ 方法来实现这一点?