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()配合使用。
感谢您的输入。是否要发表评论?我的答案看起来和我所接受的完全一样。