【发布时间】:2012-01-30 23:41:49
【问题描述】:
考虑这段代码:
struct A {};
struct B
{
B(A* a) : a(a) {}
private:
A* a;
};
struct base
{
base(B b) : b(b) {}
protected:
A a;
private:
B b;
};
struct derived : public base
{
derived() : base(B(&a)) // <-- IS THIS OK?
{}
};
这里,基类需要一个B对象,由派生类传递给它的构造函数,B对象引用了一个A对象,但是A对象存在于基类内部。
B 对象的构造函数除了存储它之外对 A 指针没有做任何事情,所以我认为这应该没问题,但仍然感觉不对,因为从技术上讲,A 对象在我当时还不存在'将其传递给基础构造函数。
我这样做会不会遇到麻烦,还是应该这样?
【问题讨论】:
-
安全,只要“a”(如您所标记的)是“结构派生”的成员 - 确保“a”存在结构派生的对象
-
不要使用这样冲突的变量名,否则这段代码的维护者会受到伤害。
-
一开始我想说类型不匹配,但我记得隐式构造。
explicit关键字应该是隐含的,由implicit关键字代替。 -
@BenVoigt:哪里有冲突的变量名?
-
@trinithis:隐式构造发生在哪里?
标签: c++ inheritance undefined-behavior