我遇到的问题是,我尝试调用的方法未被调用,而是调用了其他方法。它的设计非常奇怪而且很大,但我设法用它做了一个例子。这个例子仍然很大,它是我能做的较小的。
#include <iostream>
#include <vector>
class IObserver
{
};
class IAObserver : public IObserver
{
public:
virtual void someSpecificMethod(int i) = 0;
};
class ISomeOtherObject
{
public:
virtual void someMethodFromThatObject() = 0;
};
class SomeOtherObject : public ISomeOtherObject
{
public:
virtual void someMethodFromThatObject()
{
std::cout << "Some implementation from that object" << std::endl;
}
};
class AObserverImpl : public IAObserver, public SomeOtherObject
{
public:
virtual void someSpecificMethod(int i)
{
std::cout << "Some implementation " << i << std::endl;
}
virtual void someMethodFromThatObject()
{
std::cout << "Better implementation from our object" << std::endl;
}
};
class Base
{
public:
virtual void addObserver(IObserver* observer) = 0;
};
class A : public Base
{
public:
virtual void addObserver(IObserver* observer)
{
m_observers.push_back((IAObserver*)observer);
}
void notifyObservers()
{
std::vector<IAObserver*>::iterator it;
for(it = m_observers.begin(); it != m_observers.end(); it++)
{
(*it)->someSpecificMethod(5);
}
}
private:
std::vector<IAObserver*> m_observers;
};
int main()
{
A* a = new A();
SomeOtherObject* observer = new AObserverImpl();
a->addObserver((IObserver*)observer);
a->notifyObservers(); //output: Better implementation from our object
}
这是 Ideonehttp://ideone.com/yAT6M7
正如你所看到的,它应该调用该方法someSpecificMethod
但它正在调用该方法someMethodFromThatObject
。知道发生了什么事吗?这个物体是切片吗?在 CLion 调试器中,我什至无法调用我的someSpecificMethod
方法。我该如何解决这个问题?
问题是你正在使用 C 风格的强制转换,而你应该使用dynamic_cast反而。
C 风格的强制转换对 C++ 对象一无所知,因此它们不进行类型检查。为了在多重继承情况下在基类之间进行转换,您必须使用dynamic_cast
确保新指针的所有设置均正确。
如果将示例中的所有 C 风格转换替换为dynamic_cast
,那么它应该可以工作。
如果您想了解更多相关内容,请搜索 C++、v-tables 和多重继承。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)