假设我有一个类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
和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++方法来实现这一点?
+1如果你想选择性地将分配从'Foo'(OP的“hack”的半奇数版本)中分离出来,那么采用'shared_ptr'的替代构造函数就足以在外部提供它。很好的答案。 –
WhozCraig
太好了,谢谢!这是我本周提出的第二个问题,其结果取决于初始化列表。我想我会更多地阅读它们。 – jme