什么是动态类型的对象

use*_*214 10 c++ inheritance pointers lvalue subobject

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

1.3.3 - 由左值表达式表示的左值所指的最派生对象(1.8)的类型.[示例:如果指针(8.3.1)p的静态类型是"指向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;
}
Run Code Online (Sandbox Code Playgroud)

Kla*_*aim 24

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

不.

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

也就是说,如果我们有:

class A {

};

class B : public A { };


B l;
A& k = l;
Run Code Online (Sandbox Code Playgroud)

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

这里"动态"具有"仅在运行时才知道"的含义.

  • +1,但我认为你可以通过添加一个不使用new的例子来更清楚地说明这个例子. (3认同)

era*_*ran 6

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

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


Mat*_* M. 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"; }
Run Code Online (Sandbox Code Playgroud)

在该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);
  }
};
Run Code Online (Sandbox Code Playgroud)
  • is和is的staticanddynamic类型。baseBasederivedDerived
  • print方法中,static类型bBase(总是)
  • 根据参数的数量,dynamicofbBaseDerived

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