13

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

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

还有下面的引用是什么意思

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

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

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

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

4 回答 4

26

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

没有。

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

也就是说,如果我们有:

class A {

};

class B : public A { };


B l;
A& k = l;

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

这里“动态”的意思是“仅在运行时知道”。

于 2011-10-04T14:45:28.240 回答
6

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

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

于 2011-10-04T14:44:53.873 回答
5

在静态类型语言(例如 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);
  }
};
  • is和is的staticanddynamic类型。baseBasederivedDerived
  • print方法中,static类型bBase(总是)
  • 根据参数的数量,dynamicofbBase或者Derived

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

于 2011-10-04T15:13:06.637 回答
-2

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

于 2011-10-04T15:31:41.200 回答