#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;
}
输出是什么?我最初以为它将是“D E C”,但是运行该程序后,它是“A E C”
能否详细说明这段代码的背后是什么:
A* a = new B();
最佳答案
虚拟成员函数是根据对象的动态(运行时)类型调度的。基于对象的静态(编译时)类型调度非虚拟成员函数。
A *a = new B();
a
指向动态类型为B
的对象。 a
的静态类型是A*
,但是,这意味着*a
的静态类型是A
。根据动态类型调度虚拟函数(
m2
和m3
),因此调用B::m2
和B::m3
。非虚拟功能是基于静态类型调度的。
*a
的静态类型是A
,因此调用A::m1
。new
行中到底发生了什么?动态创建一个类型为B
的新对象,并且new
表达式返回一个指向该对象的指针(类型为B*
)。然后,将派生到基的转换应用于该指针,以将其转换为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;
关于c++ - 简单C++继承的解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31049182/