在类层次结构中保留多态(C ++)

时间:2014-04-01 20:36:49

标签: c++ inheritance dynamic runtime polymorphism

之前必定会有人问这样的事情,但我没有找到直接解决下面问题的答案。这是一个非常基本的问题,但是,远离我的书,我正在消隐。

我定义了父类和子类:

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()中将单词类型切换为令牌类型;但我在如何做到空白,以达到我的目标。是的,我很尴尬。

3 个答案:

答案 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
}