【问题标题】:Type of Derived Class from Base Pointer C++基指针 C++ 派生类的类型
【发布时间】:2012-12-05 12:32:57
【问题描述】:

这是场景:

class Base {
public:
  typedef Base type;
};

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

我想要类似的东西:

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

  decltype(*bs)::type newvar;
}

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

【问题讨论】:

  • 为什么这两个 typedef 需要命名相同?我觉得这可能会给以后的程序造成一些混乱..
  • 如果我更改类型名称,我怎样才能让它工作??

标签: c++ templates inheritance polymorphism typedef


【解决方案1】:

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

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

你说你想要“类似”你展示的代码——你想用它来完成什么?我很确定答案将是“如果您想根据动态类型执行操作,请使用虚函数”,因为 dynamic_cast 通常不是一个真正的选择。

【讨论】:

  • 我需要将类型传递给 std::is_same
  • is_same 是一个模板,因此只能访问静态类型。你想用is_same 完成什么?描述目标,而不是您尝试用来实现该目标的手段;)
  • 要获得类似is_same 的动态类型,您必须将评估延迟到运行时并使用虚函数,通常用于两个对象。这个问题被称为“双重调度”,在 C++ 中可能相当乏味。也许您想查看它以了解如何完成比较。
  • 只是想知道我是否可以避免使用模板进行静态转换:)
  • static_cast 与您的问题完全无关。或is_same
【解决方案2】:

不,你不能那样做。

C++ 是静态类型语言,这意味着必须在编译时确定类型。
在示例中,bs 不知道它所指向的对象类型。
请看下面的场景以使其更清晰:

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

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

【讨论】:

  • @Itzurabhi 您正在在您的代码中使用 TMP。但这并没有改变 iammilind 在他的回答中所说的:你不能以这种方式混合静态和动态类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2021-09-09
  • 2013-09-23
相关资源
最近更新 更多