#include <iostream>
using namespace std;
class A {
public:
void m1(){ cout << 'A'; }
virtual void m2(){ cout << 'B'; }
virtual void m3(){ cout << 'C'; }
};
class B: public A {
public:
void m1(){ cout << 'D'; }
void m2(){ cout << 'E'; }
};
class C: public B {
public:
void m3(){ cout << 'F'; }
};
int main()
{
cout << "Hello World!" << endl;
A* a = new B();
a->m1();
a->m2();
a->m3();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是输出?我最初认为它将是"DE C",但在运行程序后它是"AE C"
可以详细说明这行代码背后的情况:
A* a = new B();
Run Code Online (Sandbox Code Playgroud)
根据对象的动态(运行时)类型调度虚拟成员函数.根据对象的静态(编译时)类型调度非虚拟成员函数.
A *a = new B();
Run Code Online (Sandbox Code Playgroud)
a指向动态类型为的对象B.静态类型的a是A*,然而,这意味着该静态类型的*a是A.
虚拟功能(m2和m3)是基于动态类型布控,所以B::m2和B::m3被调用.
基于静态类型调度非虚函数.静态类型*a是A,所以A::m1被称为.
究竟是怎么回事new?类型的新对象B是动态创建的,new表达式返回指向该对象(类型B*)的指针.然后,对该指针应用派生到基础的转换,将其转换为a A*,用于初始化变量a.
在伪代码中,显示中间步骤:
B *tmp_b = new B(); // allocate and initialise B object
A *tmp_a = convert_derived_to_base(tmp_b);
A *a = tmp_a;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |