我在学习AGenericNon-intrusiveSmartPointerImplementation。我对第4节有些困惑。一种说法是theexpressionsuppliedastheargumenttothetypeidoperatorisonlyevaluatediftheresulttypeisanlvalueofpolymorphicclasstype.相关的示例代码是:templatevoid*startOfObject(T*p){void*q=static_cast(p);typeid(q=dynamic_cast(p),*p);//Thislinereturnq;}AF
我在学习AGenericNon-intrusiveSmartPointerImplementation。我对第4节有些困惑。一种说法是theexpressionsuppliedastheargumenttothetypeidoperatorisonlyevaluatediftheresulttypeisanlvalueofpolymorphicclasstype.相关的示例代码是:templatevoid*startOfObject(T*p){void*q=static_cast(p);typeid(q=dynamic_cast(p),*p);//Thislinereturnq;}AF
在研究最近的一个问题时,我发现了'03标准[1]中的以下条款:Whentypeidisappliedtoanlvalueexpressionwhosetypeisapolymorphicclasstype(10.3),theresultreferstoatype_infoobjectrepresentingthetypeofthemostderivedobject(1.8)(thatis,thedynamictype)towhichthelvaluerefers.Ifthelvalueexpressionisobtainedbyapplyingtheunary*operatortoap
在研究最近的一个问题时,我发现了'03标准[1]中的以下条款:Whentypeidisappliedtoanlvalueexpressionwhosetypeisapolymorphicclasstype(10.3),theresultreferstoatype_infoobjectrepresentingthetypeofthemostderivedobject(1.8)(thatis,thedynamictype)towhichthelvaluerefers.Ifthelvalueexpressionisobtainedbyapplyingtheunary*operatortoap
我正在尝试做类似的事情:classBase{public:Base(){cout问题是,当我需要查看Derived和MoreDerived时,我总是将Base打印到屏幕上。有没有办法让typeid以这种方式与派生类一起工作?或者除了typeid还有别的办法吗?注意:我正在向已编码的套件添加功能,因此我不想在派生类自己返回此值的基类中添加虚拟方法。另外,不用担心运行时开销,这将是调试编译开关的一部分。 最佳答案 在构造函数Base()中,对象仍然是一个“Base”实例。它将在Base()构造函数之后成为Derived实例。尝试在构造之
我正在尝试做类似的事情:classBase{public:Base(){cout问题是,当我需要查看Derived和MoreDerived时,我总是将Base打印到屏幕上。有没有办法让typeid以这种方式与派生类一起工作?或者除了typeid还有别的办法吗?注意:我正在向已编码的套件添加功能,因此我不想在派生类自己返回此值的基类中添加虚拟方法。另外,不用担心运行时开销,这将是调试编译开关的一部分。 最佳答案 在构造函数Base()中,对象仍然是一个“Base”实例。它将在Base()构造函数之后成为Derived实例。尝试在构造之
假设我们有一个类层次结构。在底部我们有Base和在顶部Derived。即使转换为基类指针,如何确定对象类。Base*b=newDerived():typeid(b).name();//iwantthistotellmethatthisisactuallyderivednotbaseobject除了手动实现字符串字段或类似的虚拟获取功能之外,还有其他方法吗?PS:我说的是独立于编译器的解决方案 最佳答案 确保基类至少有一个虚方法,包括并使用您当前的代码,只需额外取消引用typeid(*b).name().顺便提一下,typeidcal
假设我们有一个类层次结构。在底部我们有Base和在顶部Derived。即使转换为基类指针,如何确定对象类。Base*b=newDerived():typeid(b).name();//iwantthistotellmethatthisisactuallyderivednotbaseobject除了手动实现字符串字段或类似的虚拟获取功能之外,还有其他方法吗?PS:我说的是独立于编译器的解决方案 最佳答案 确保基类至少有一个虚方法,包括并使用您当前的代码,只需额外取消引用typeid(*b).name().顺便提一下,typeidcal
classfoo{public:voidsay_type_name(){std::cout上面的代码使用g++在我的ubuntu机器上打印P3foo。我不明白为什么它打印P3foo而不仅仅是foo。如果我像这样更改代码std::cout它打印3foo。有什么想法吗? 最佳答案 因为它是指向foo的指针。foo有3个字符。所以它变成了P3foo。另一个是foo类型,所以它变成3foo。请注意,文本是依赖于实现的,在这种情况下,GCC只是为您提供了内部的、错位的名称。在程序c++filt中输入该损坏的名称以获得未损坏的名称:$c++fi
classfoo{public:voidsay_type_name(){std::cout上面的代码使用g++在我的ubuntu机器上打印P3foo。我不明白为什么它打印P3foo而不仅仅是foo。如果我像这样更改代码std::cout它打印3foo。有什么想法吗? 最佳答案 因为它是指向foo的指针。foo有3个字符。所以它变成了P3foo。另一个是foo类型,所以它变成3foo。请注意,文本是依赖于实现的,在这种情况下,GCC只是为您提供了内部的、错位的名称。在程序c++filt中输入该损坏的名称以获得未损坏的名称:$c++fi