我有两节课。

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并检查是否为null
if (auto w = std::dynamic_pointer_cast<B>(findWindow("Game"))) {
  w->setHint(window);
}

07-26 02:25