【发布时间】:2010-01-15 16:16:01
【问题描述】:
我有一个关于这样的工作人员的任务。
有一个 class A 有一个类型为 class B 的对象作为它的成员。由于我希望 B 成为其他类组的基类,因此我需要使用指针或对对象的引用,而不是副本,才能在 A 中正确使用 B 的虚拟方法。但是当我写这样的代码时
class B
{public:
B(int _i = 1): i(_i) {};
~B()
{i = 0; // just to indicate existence of problem: here maybe something more dangerous, like delete [] operator, as well!
cout << "B destructed!\n";
};
virtual int GetI () const {return i;}; // for example
protected:
int i;
};
class A
{public:
A(const B& _b): b(_b) {}
void ShowI () {cout <<b.GetI()<<'\n';};
private:
const B& b;
};
并以这种方式使用它
B b(1);
A a(b);
a.ShowI();
完美运行:
1
B destructed!
但是
A a(B(1));
a.ShowI();
给出非常不想要的结果:对象 b 创建并且 a.b 被设置为对它的引用,但是在 A 的构造函数完成之后,对象 b 破坏了!输出是:
B destructed!
0
我再重复一遍,在 A 中使用副本而不是对 b 的引用
class A
{public:
A(B _b): b(_b) {}
void ShowI () {cout <<b.GetI()<<'\n';};
private:
B b;
};
如果 B 是基类并且 A 将其称为虚函数,则将不起作用。也许我太愚蠢了,因为我不知道编写必要代码以使其完美运行的正确方法(那么我很抱歉!)或者可能根本不那么容易:-(
当然,如果 B(1) 被发送到函数或方法,而不是类构造函数,它工作得很好。当然,我可以使用与this 问题中描述的here 相同的代码来创建B 作为正确可克隆的基对象或派生对象,但是对于这样简单的问题来说似乎太难了?如果我想使用我无法编辑的 B 类怎么办?
【问题讨论】:
标签: c++ inheritance pointers pass-by-reference