我认为动态类型意味着使用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;
}
答案 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
类型b
为Base 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
dynamic
类base
为Base
,derived
为Derived
。print
方法中,static
类型b
为Base
(始终)dynamic
的{{1}}为b
或Base
当前的错误是假设多态性必然基于动态内存分配,但这两个概念虽然不是正交的,但在某些情况下可以互相使用。
答案 3 :(得分:-1)
动态内存分配总是在运行时完成。可以使用“new”关键字来实现。 但是你的问题中还提到了另外一个案例* p =&amp; d这里你已经创建了基类函数“Virtual”它告诉编译器用它来处理“p”内容而不是它所属的指针类型.so这是动态内存分配之一,因为编译器永远不知道您将在运行时存储哪个类对象的地址,它只知道它是哪种类型的指针(即基类指针或派生类指针)。