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类型?
如果不了解整个项目,我会说正确的解决方案可能会在基类中添加一个虚函数.
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)