基指针C ++中的派生类的类型

时间:2012-12-05 12:32:58

标签: c++ templates inheritance polymorphism typedef

这是情景:

class Base {
public:
  typedef Base type;
};

class Derived: public Base {
public:
  typedef Derived type;
};

我想要类似的东西:

int main() {
  Base * bs = new Derived();

  decltype(*bs)::type newvar;
}

如何在不使用静态/动态强制转换的情况下执行上述类似的操作来获取Derived类的类型?

2 个答案:

答案 0 :(得分:2)

在您的代码中,*bs实际上有两种类型:静态类型,即声明它的类型,即Base。另一种类型是动态类型,它是它实际指向的对象的类型,在您的情况Derived中。静态类型是编译时唯一已知的类型,无法更改。 TMP,普通函数调用和所有模板事件都发生在编译时,因此只有静态类型适用于那些。

使用动态类型的方法是向编译器明确说明,即调用虚函数或使用dynamic_cast

你说你想要“类似”你所展示的代码 - 你想用它完成什么?我很确定答案是“如果你想根据动态类型做事情,可以使用虚函数”,因为dynamic_cast通常不是一个真正的选择。

答案 1 :(得分:1)

不,你不能那样做。

C ++是静态类型语言,这意味着必须在编译时确定类型 在示例bs中,它不知道它指向的对象类型 请参阅下面的方案,以便更清楚:

Base * bs = (bool)? new Base() : new Derived();

您必须依靠virtual机制或dynamic_cast来实现您的最终目标。