比较指针.多重继承问题
Comparing pointers. Multiple inheritance issue?
我正在调试一些代码。此方法已执行:
void EventNotifier::notify_observers(SpEventInfo pEvent, Observable* target)
{
std::list<Observer*>::iterator it;
for (it = m_observers.begin(); it != m_observers.end(); ++it)
{
Observable* observedTarget = (*it)->target();
bool fNotify = (observedTarget == target);
...
上一段节选的最后一句已被执行。两个变量,observedTarget和target,有相同的值,但布尔fNotify是假的!所涉及的"目标"对象使用多重继承,而"可观察对象"是父对象之一。但是所有东西都被强制转换为Observable,所以比较应该只是相同类型的指针。实际上,调试器对两个指针显示相同的值。
我不知道问题出在哪里。非常感谢任何帮助。谢谢你Cecilio Salmeron
两个变量,observedTarget和target,有相同的值,但布尔fNotify是假的!
您可以通过添加print语句来检查代码:
printf("%p == %p is %dn", observedTarget, target, int(fNotify));
涉及的'target'对象使用多重继承,'Observable'是父对象之一。
如果对象可能不止一次从Observable
派生,那么您可能希望比较完整派生对象的地址。dynamic_cast<void*>(ptr)
返回ptr
引用的完整派生对象的地址,因此:
bool fNotify = dynamic_cast<void*>(observedTarget) == dynamic_cast<void*>(target);
如果在转换指针时使用了错误的类型强制转换,无论是在函数参数中还是在target()
的返回值中,都可能得到一个损坏的指针。dynamic_cast
是最好的,static_cast
应该也是安全的。reinterpret_cast
可能会导致问题,而旧的c风格强制转换可能是reinterpret_cast
,这取决于它的使用方式。如果您没有使用显式强制转换,那么也应该是可以的,自动转换将始终是安全的。
当您第一次发现将指针转换为继承树中的不同类型可以改变指针值时,您会感到惊讶。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承问题 C++
- 可视化设计问题 - 多重继承,C++
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 如何解决这个C++多重继承类似的问题
- 在 OMNeT++ 中使用多重继承时是否存在任何已知问题
- C++多重继承内存寻址问题
- c++多重继承设计问题
- 多重继承的菱形问题:Gcc / Clang错误,但Visual Studio没有错误
- 一个c++问题,涉及多重继承、模板和静态变量
- 关于C++多重继承的问题
- 比较指针.多重继承问题