之前必定会有人问这样的事情,但我没有找到直接解决下面问题的答案。这是一个非常基本的问题,但是,远离我的书,我正在消隐。
我定义了父类和子类:
class token{...};
class word: public token{...};
类令牌与word共享一个变量;这个词进一步细化了令牌。这两个课程都不是虚拟的。
我有以下签名的辅助函数,其中包含代表性的创建代码:
token
maker()
{
...
case ...: // (1)
return token(...);
case ...: // (2)
return word(...);
...
},
显然它的想法是创建适当的类型,并将其作为标记返回。
我的意思是通过静态地将其分配给令牌类型来使用返回的对象,并在适当时动态解析为真实类型(单词或标记),如
token t = maker(); // I want to be able to use the methods of word, if
// maker actually made a word (true polymorphic behavior)
我意识到这应该是通过指针或引用来启用多态,并且在当前设计maker()中将单词类型切换为令牌类型;但我在如何做到空白,以达到我的目标。是的,我很尴尬。
答案 0 :(得分:1)
要使多态性起作用,您需要虚函数,并且必须使用指针和引用,而不是类型本身。
案例:
token* maker(...) {
...
switch(...) {
case ...: // (1)
return new token(...);
case ...: // (2)
return new word(...);
}
...
}
虽然也许你应该使用std::unique_pointer<token>
来获得所有权的回报和参数。另请参阅std::shared_pointer
。
删除它们:
delete pToken;
显然,你需要一个令牌本身的虚拟dtor。
答案 1 :(得分:0)
在制造商中退回std::unique_ptr<token>
。虽然我不得不说,当你说
类令牌与word共享一个变量;这个词进一步细化了令牌。 这两个课程都不是虚拟的。
我不确定公共继承是否合适。听起来更多的是,这个词使用令牌来共享实现,因为没有虚函数。
答案 2 :(得分:-1)
首先,使用指针。第二,使用dynamic_cast&lt;&gt;
更改制造商以返回指针 并使用它:
token* t = maker();
if( word* w = dynamic_cast<word*>(t) )
{
// if you get here, w is a valid word
}