#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

根据动态类型调度虚拟函数(m2m3),因此调用B::m2B::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/

10-11 03:57