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

C++ 在类层次结构(C+;+;)中保留多态性,c++,inheritance,dynamic,runtime,polymorphism,C++,Inheritance,Dynamic,Runtime,Polymorphism,以前一定有人问过类似的问题,但我没能找到直接针对以下问题的答案。这是一个非常基本的问题,但是,离开我的书,我是空白的 我定义了一个父类型和子类型类: class token{...}; class word: public token{...}; 类标记与word共享一个变量;单词进一步细化了标记。两个类都不是虚拟的 我有一个具有以下签名的助手函数,并显示了代表性的创建代码: token maker() { ... case ...: // (1) return

以前一定有人问过类似的问题,但我没能找到直接针对以下问题的答案。这是一个非常基本的问题,但是,离开我的书,我是空白的

我定义了一个父类型和子类型类:

class token{...};  

class word: public token{...};  
类标记与word共享一个变量;单词进一步细化了标记。两个类都不是虚拟的

我有一个具有以下签名的助手函数,并显示了代表性的创建代码:

token  
maker()  
{  
...  
case ...: // (1)
  return token(...);
case ...: // (2)
  return word(...);
...
},  
很明显,它创建了适当的类型,并将其作为标记返回

我的意思是通过静态地将返回的对象分配给令牌类型来使用它,并在适当的时候动态解析为真类型(word或token),如中所示

token t = maker(); // I want to be able to use the methods of word, if 
                   // maker actually made a word (true polymorphic behavior)

我意识到这应该通过指针或引用来启用多态性,并且在当前的design maker()中,将单词类型划分为标记类型;但我不知道如何调整以上各项以实现我的目标。是的,我很尴尬

首先,使用指针。第二,使用动态_cast

将生成器更改为返回指针 然后像这样使用它:

token* t = maker();
if( word* w = dynamic_cast<word*>(t) )
{
    // if you get here, w is a valid word
}
token*t=maker();
if(单词*w=动态_-cast(t))
{
//如果你到了这里,w是一个有效的词
}

在maker中返回一个
std::unique\u ptr
。虽然你说的时候我不得不这么说

类标记与word共享一个变量;单词进一步细化了标记。 两个类都不是虚拟的


我不确定公共继承是否合适。word使用令牌共享实现听起来更像是因为没有虚拟函数。

要使多态性工作,您需要虚拟函数,并且必须使用指针和引用,而不是类型本身

例如:

token* maker(...) {
    ...
    switch(...) {
    case ...: // (1)
        return new token(...);
    case ...: // (2)
        return new word(...);
    }
    ...
}
尽管您可能应该使用
std::unique_pointer
作为分配所有权的返回和参数。另请查看
std::shared_指针
。 删除它们,并添加以下内容:

delete pToken;

显然,在令牌本身中需要一个虚拟DoR。

如果你想在多态性时不使用CARRO引用或指针,考虑使用类型擦除或(稍后可以被视为一种基于函数的类型擦除)使用多态性指针。一个局部变量。与重复数据消除工具的
maker()配合使用。
感谢您的输入。是否要发表评论?我的答案看起来和我所接受的完全一样。