为什么C ++构造函数接受不正确的类型作为参数?

时间:2017-07-04 03:42:33

标签: c++ inheritance constructor

标题几乎说明了一切。我有一个构造函数

Brain::Synapse::Synapse(Neuron *new_neuron);

但是当我传递一个不正确的类型(来自这样的矢量的成员)

std::vector<Motor_Neuron*> neurons;
Synapse *new_synapse = new Synapse(neurons[neuron_index]);

它运作得很好(这就是问题所在)。 Motor_Neuron是来自Neuron的派生类,所以我怀疑这就是原因。我的问题最终是我需要将一些Synapse连接到Neuron s,将其他Motor_Neuron连接到Synapse s。 Incident Identifier: 19B778C7-623F-40D4-871E-EDF3C16240DB CrashReporter Key: TODO Hardware Model: iPhone6,2 Version: 8.2.2 (1814) Code Type: ARM-64 Parent Process: launchd [1] Date/Time: 2017-07-02 14:41:07 +0000 OS Version: iPhone OS 8.3 (12F70) Report Version: 104 Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x10 Crashed Thread: 0 Thread 0 Crashed: 0 libobjc.A.dylib objc_msgSend + 16 1 UIKit -[UINavigationController _customTransitionController:] + 320 2 UIKit _popViewControllerNormal + 412 3 UIKit -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:] + 644 4 UIKit -[UINavigationController popViewControllerAnimated:] + 572 5 METDyldCollection -[UINavigationController(KMNavigationBarTransition) km_popViewControllerAnimated:] (UINavigationController+KMNavigationBarTransition.m:94) 6 imeituan -[UINavigationController(HTKPushPopHook) pushpop_hook_popViewControllerAnimated:] (UINavigationController+HTKPushPopHook.m:50) 7 METDyldCollection __67-[SAKTransitionSafeNavigationController popViewControllerAnimated:]_block_invoke (SAKTransitionSafeNavigationController.m:75) 8 METDyldCollection -[SAKTransitionSafeNavigationController addTransitionBlock:] (SAKTransitionSafeNavigationController.m:167) 9 METDyldCollection -[SAKTransitionSafeNavigationController popViewControllerAnimated:] (SAKTransitionSafeNavigationController.m:73) 10 METDyldCollection -[MLNavigationController popViewControllerAnimated:] (MLNavigationController.m:51) 类的成员是指向&#34;连接的神经元&#34;的指针。我一直试图重载构造函数,但我认为这不会起作用,因为如果其中一个构造函数接受了错误的类型,我就不会看到如何选择正确的构造函数。

1 个答案:

答案 0 :(得分:2)

如果Motor_Neuron继承自Neuron,则其类型不正确。这是继承的全部基础;继承的类他们的父类,只是添加了一些额外的部分。

听起来您需要处理应用程序的类层次结构。 SOLID 原则是很好的指导原则。相关的一个是 Liskov替换原则,其中指出“程序中的对象应该可以替换其子类型的实例,而不会改变该程序的正确性。”如果您的Motor_Neuron无法填写Neuron的角色,那么它不应该继承它。如果需要利用Neuron中的某些功能,可能会将Neuron作为成员并从中使用其功能。

有创建Motor_Neuron构造函数并删除它或抛出异常的解决方法,但我并不是很容易尝试修复这样的症状,而是转向源代码;你的设计。