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.
这里"动态"具有"仅在运行时才知道"的含义.
的静态类型是变量,其在已知的唯一类型的类型编译时(因此认为是静态的-不能改变).的动态类型是实际被指向的对象的类型的运行时.这里的动态意味着它只在运行时知道,这意味着它可能会改变(即一个变量可以指向各种类型的各种对象).
new
正如您自己的示例所示,此内容中的使用无关紧要.在你的main中,静态和动态类型d
是Derived
,因为它不是指针或引用.p
但是,它具有静态类型Base
,但在您的代码中,动态类型将是Derived
.
在静态类型语言中,例如 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
类型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);
}
};
Run Code Online (Sandbox Code Playgroud)
static
anddynamic
类型。base
Base
derived
Derived
print
方法中,static
类型b
是Base
(总是)dynamic
ofb
是Base
或Derived
假设多态性必然基于动态内存分配是当前的错误,但这两个概念虽然不是正交的,但在某些情况下可以单独使用。
归档时间: |
|
查看次数: |
5258 次 |
最近记录: |