gpt4 book ai didi

c++ - 对象在将其指针转换为基数后未调用好的方法

转载 作者:行者123 更新时间:2023-11-30 01:08:43 24 4
gpt4 key购买 nike

我遇到一个问题,我尝试调用的方法没有被调用,而是调用了其他一些方法。它的设计非常奇怪而且很大,但我设法用它做了一个例子。这个例子仍然很大,因为它是我能够做的更小的例子。

#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 但它正在调用方法 someMethodFromThatObject。知道发生了什么事吗?这个对象是切片吗?在 CLion 调试器中,我什至无法调用我的 someSpecificMethod 方法。我该如何解决这个问题?

最佳答案

问题是您使用的是 C 风格的转换,而您应该使用 dynamic_cast。相反。

C 风格的转换对 C++ 对象一无所知,因此它们不进行类型检查。为了在多重继承情况下在基类之间进行转换,您必须使用 dynamic_cast 来确保为新指针正确设置所有内容。

如果您将示例中的所有 C 风格转换替换为 dynamic_cast,那么它应该可以工作。

如果您想了解更多相关信息,请搜索 C++、v 表和多重继承。

关于c++ - 对象在将其指针转换为基数后未调用好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41598341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com