我有两节课。
class A:
class B: public A
{
//new function
void setHint(...);
}
并具有结构数据。
typedef std::shared_ptr<A> window_ptr;
std::stack<window_ptr> m_windowsStack;
m_windowsStack.push(std::make_shared<A>("Hint"));
m_windowsStack.push(std::make_shared<B>("Game"));
并在堆栈中找到函数:
std::shared_ptr<A> WindowManager::findWindow(std::string title)
{
... return result;
}
并使用函数查找堆栈中的元素:
auto w = findWindow("Game"); //return element type B
w->setHint(window);
但是事实证明,函数findWindow返回
type A
。我收到错误消息“'class A'没有名为'setHint'的成员w-> setHint(window);“
我是否需要将A类中的setHint函数声明为虚函数?如何使变量自动了解其类型为B?
最佳答案
如果不了解您的整个项目,我会说正确的解决方案很可能会在基类中添加一个虚函数。
class A {
public:
virtual void setHint(/*...*/) { /* some default implementation */}
// or pure virtual
virtual void setHint(/*...*/) = 0;
virtual ~A() = default; // base class should have a virtual destructor
};
class B: public A {
public:
void setHint(/*...*/) override;
};
另外,如果您知道,可以确定指向
findWindow
的返回值的类型是B
,则可以简单地对其进行static_pointer_cast
auto w = std::static_pointer_cast<B>(findWindow("Game"));
w->setHint(window);
如果不确定,并且
A
是多态类型(具有任何virtual
函数),则可以dynamic_pointer_cast
并检查是否为nullif (auto w = std::dynamic_pointer_cast<B>(findWindow("Game"))) {
w->setHint(window);
}