继承c ++

Tip*_*pok 1 c++ virtual inheritance c++11

我有两节课.

class A:

class B: public A
{
     //new function
     void setHint(...);
}
Run Code Online (Sandbox Code Playgroud)

并有结构数据.

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"));
Run Code Online (Sandbox Code Playgroud)

并在堆栈中找到函数:

std::shared_ptr<A> WindowManager::findWindow(std::string title)
{
    ... return result;
}
Run Code Online (Sandbox Code Playgroud)

并在堆栈中使用find元素的函数:

auto w = findWindow("Game"); //return element type B 
w->setHint(window);
Run Code Online (Sandbox Code Playgroud)

但事实证明函数findWindow返回type A.我得到错误"'A类'没有名为'setHint'w-> setHint(window)的成员;"

我是否需要将A类中的setHint函数声明为虚函数?如何使变量自动理解它是B类型?

Rya*_*ing 5

如果不了解整个项目,我会说正确的解决方案可能会在基类中添加一个虚函数.

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;
};
Run Code Online (Sandbox Code Playgroud)

或者,如果您确定指向返回值的类型findWindow是a B,则可以简单地将static_pointer_cast其关闭

auto w = std::static_pointer_cast<B>(findWindow("Game"));
w->setHint(window);
Run Code Online (Sandbox Code Playgroud)

如果您不确定,并且A是多态类型(具有任何virtual功能),您可以dynamic_pointer_cast检查null

if (auto w = std::dynamic_pointer_cast<B>(findWindow("Game"))) {
  w->setHint(window);
}
Run Code Online (Sandbox Code Playgroud)