关于简单c ++继承的解释

tom*_*tom 1 c++ inheritance

#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)

Rei*_*ica 6

根据对象的动态(运行时)类型调度虚拟成员函数.根据对象的静态(编译时)类型调度非虚拟成员函数.

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)