[英]Pass member of derived class into constructor of base class
我有一个抽象基数 class 父级拥有一个抽象基数 class 子级,以及一个对应的派生父级拥有一个派生子级。
我希望能够在派生父级的初始化中构造派生子级,同时还保留对派生子级本身的引用——但这并不简单。 因为我需要先初始化基类,所以我不能将对派生子类的已初始化引用传递到基类的构造函数中。
我可以将基类的指向派生子类的基指针动态转换回派生类型指针以作为成员保留,但这不是明智的方法。 这种事情有模式吗?
前任。
这是我希望能够做的,但显然不能:
DerivedParent::DerivedParent():
_derivedChild(new DerivedChild()),
BaseParent(_derivedChild)
{}
虽然这是有效的,但显然不明智:
DerivedParent::DerivedParent():
BaseParent(new DerivedChild()),
_derivedChild(dynamic_cast<DerivedChild*>(_baseChild))
{}
这种事情有模式吗,还是我在做一些根本上很愚蠢的事情?
首先,你为什么需要这样做? 如果你需要基类 class 的一些属性,为什么不把它传递给子类的构造函数呢? 或者将属性标记为受保护并在子 class 中访问它?
基地 class 不应该知道孩子 class。这是 SOLID 的 O'Open/Closed' 原则。 这意味着每次添加子 class 时,都必须更改基数 class。
所以,孩子应该拥有正确初始化所需的一切。
BaseParent
有一个_baseChild
成员,你的_derivedChild(dynamic_cast<DerivedChild*>(_baseChild))
的第二个解决方案很好。 由于您知道类型会匹配,因此您也可以改用static_cast
。 事实上,由于您知道_baseChild
的动态类型将始终是DerivedChild
,因此您只需将成员函数中的this->_derivedChild
替换为static_cast<DerivedChild*>(this->_baseChild)
(可能在 getter 函数后面)。
您还可以使用委托构造函数来避免强制转换:
DerivedParent() : DerivedParent(new DerivedChild()) {}
private:
DerivedParent(DerivedChild* derivedChild) :
BaseParent(derivedChild), _derivedChild(derivedChild) {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.