私が呼び出すメソッドが呼び出されず、代わりに他のメソッドが呼び出されるという問題があります。それは非常に奇妙で大きなデザインですが、私はその中から一つの例を取ることができました。この例はまだ大きく、私ができることはそれよりも小さいです。あなたが見ることができるようにオブジェクトがベースへのポインタをキャストした後に適切なメソッドを呼び出さない
#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
}
ここIdeone http://ideone.com/yAT6M7
だだから、メソッドsomeSpecificMethod
を呼び出すことになっているが、それはmehod someMethodFromThatObject
を呼びました。何が起こっているのか?このオブジェクトはスライスしていますか? CLionデバッガでは、私のsomeSpecificMethod
メソッドを呼び出すことすらできません。これを回避するにはどうしたらいいですか?
'(IObserver *)observer'を行いません。あなたはUBを呼び出しています – UnholySheep
@ UnholySheepありがとうございました、あなたは理由とその代わりに何をすべきか説明できますか? – Winter
適切なC++のキャストを使う必要があります: 'dynamic_cast' - ここであなたの例を修正しました:http://ideone.com/i3zUsC – UnholySheep