2011-10-04 85 views
8

我认为动态类型是指使用new动态分配的对象。在下面的情况下,你说p指向动态类型还是静态类型的对象?在标准中,它并没有说动态类型是动态对象。什么是动态类型的对象

1.3.3 - 左值表达式将左值表示为 的最大派生对象(1.8)的类型引用。 [示例:如果指针(8.3.1)p的静态类型是“指向类B”的指针指向类D D的对象,从B(条款10)派生,则动态类型的表达式* p 是“D”。参考文献(8.3.2)的处理方式相似。 ]

而且这是什么下面的报价意味着

动态类型右值表达的是它的静态类型

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

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

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

回答

19

我认为动态类型是指动态分配的对象 使用新的。

没有。

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

也就是说,如果我们有:

class A { 

}; 

class B : public A { }; 


B l; 
A& k = l; 

这里k为类型A的一个对象的引用,但真正的类型称为对象,它的动态型,是B.

这里的“动态”具有“只在运行时才知道”的含义。

+0

+1清晰,简洁,很好的例子。 – Lou

+3

+1,但我想你可以通过添加一个根本不使用新的例子来更清楚地说明这个例子。 –

+0

'A&k = B();'是否就够了? – arne

5

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

在此内容中使用new与您自己的示例所示不相关。在你的主体中,d的静态和动态类型是Derived,因为它不是指针或引用。但是,p的静态类型为Base,但在您的代码中,动态类型为Derived

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); 
    } 
}; 
  • staticdynamic和类型的baseBasederivedDerived
  • print方法中,static类型的bBase(总是)
  • 根据参数的数目,的bdynamic要么BaseDerived

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

-1

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