什么是动态类型的对象

时间:2011-10-04 14:40:34

标签: c++ inheritance

我认为动态类型意味着使用new动态分配对象。在下面的例子中,你是说p指向动态类型还是静态类型的对象?在标准中,它没有说动态类型是动态对象。

  

1.3.3 - 左值表示的派生最多的对象(1.8)的类型   由左值表达式引用。 [示例:如果指针(8.3.1)p为其   static类型是“指向类B的指针”指向类的对象   D,源自B(第10节),表达式* p的动态类型   是“D”参考文献(8.3.2)的处理方法类似。 ]

以下引用的含义是什么意思

  

rvalue表达式的动态类型是其静态类型

class Base {
    virtual void foo(){}
};

class Derived : public Base {
    void foo(){}
};

int main()
{
    Derived d;
    Base *p = &d;
}

4 个答案:

答案 0 :(得分:22)

  

我认为动态类型意味着动态分配的对象   使用新的。

不。

动态类型是可以通过引用(包括指针)访问的对象的实际类型,该引用指向其实际类型的基本类型。

也就是说,如果我们有:

class A {

};

class B : public A { };


B l;
A& k = l;

这里k是对A类对象的引用,但引用对象的实际类型,即它的动态类型是B.

此处“动态”具有“仅在运行时知道”的含义。

答案 1 :(得分:5)

静态类型是变量的类型,它是编译时中已知的唯一类型(因此被视为静态 - 无法更改)。 动态类型是实际指向运行时的对象类型。这里的动态意味着它只在运行时才知道,这意味着它可能会发生变化(即一个变量可以指向各种类型的各种对象)。

正如您自己的示例所示,在此内容中使用new无关紧要。在您的主要版本中,d的静态和动态类型为Derived,因为它不是指针或引用。但是,p的静态类型为Base,但在您的代码中,动态类型为Derived

答案 2 :(得分:3)

在静态类型语言中,例如C ++或Java,static可以引用编译时已知的信息,而dynamic引用运行时已知的信息。

例如:

struct Base { virtual std::string name() const { return "Base"; } };

struct Derived: Base { std::string name() const { return "Derived"; } };

void print(Base const& b) { std::cout << b.name() << "\n"; }

print方法中,static类型bBase const&。因此,编译器将检查所有调用的方法是否存在于Base对象的上下文中。

但是,当执行到来时,对name的调用(因为该方法是虚拟的)是针对对象的dynamic类型执行的:

  • 这可能是Base
  • 这可能是Derived
  • 这可能是Base的另一个派生类,我们还不知道

因此,在以下示例中:

int main(int argc, char* argv[]) {
  if (argc == 1) {
    Base base;
    print();
  } else {
    Derived derived;
    print(derived);
  }
};
  • static dynamicbaseBasederivedDerived
  • print方法中,static类型bBase(始终)
  • 根据参数的数量,dynamic的{​​{1}}为bBase

当前的错误是假设多态性必然基于动态内存分配,但这两个概念虽然不是正交的,但在某些情况下可以互相使用。

答案 3 :(得分:-1)

动态内存分配总是在运行时完成。可以使用“new”关键字来实现。 但是你的问题中还提到了另外一个案例* p =&amp; d这里你已经创建了基类函数“Virtual”它告诉编译器用它来处理“p”内容而不是它所属的指针类型.so这是动态内存分配之一,因为编译器永远不知道您将在运行时存储哪个类对象的地址,它只知道它是哪种类型的指针(即基类指针或派生类指针)。