Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于构造函数调用和继承顺序的一些混淆_C++_Oop_Constructor - Fatal编程技术网

C++ 关于构造函数调用和继承顺序的一些混淆

C++ 关于构造函数调用和继承顺序的一些混淆,c++,oop,constructor,C++,Oop,Constructor,我有以下代码: class A { public: A() { cout << "A-C" << endl; } ~A(){ cout << "A-D" << endl; } }; class B { public: B() { cout << "B-C" << endl; } ~B() {

我有以下代码:

class A {
    public:
        A() { cout << "A-C" << endl; }
        ~A(){ cout << "A-D" << endl; }
};

class B {
    public:
        B() { 
            cout << "B-C" << endl; 
        }
        ~B() { 
            cout << "B-D" << endl; 
        } 
};

class C {
    protected:
        A* a;
        B b;
    public: 
        C() {
              a = new A;
              cout << "C-C" << endl; 
            }
        ~C() { 
            delete a;
            cout << "C-D" << endl; 
        }
};

class D : public C {
    protected:
        A a;
        B b;
    public:
        D(){ cout << "D-C" << endl; }
        ~D(){ cout << "D-D" << endl; }
};

int main() {
    D* d = new D;
    B* b = new B;

    delete b;
    delete d;

    system("pause");
    return 0;
}
但这是错误的。 输出实际上是:

B-C
A-C
C-C
A-C
B-C
D-C
B-C
B-D
D-D
B-D
A-D
A-D
C-D
B-D
我不知道为什么程序首先调用B的构造函数,最后调用它的析构函数。 我认为构造函数调用的顺序应该是这样的: C的构造函数->A的构造函数->B的构造函数->D的构造函数

析构函数调用的顺序与构造函数调用的顺序相反

任何人都可以告诉我为什么B的构造函数在开始时被调用,B的析构函数在最后被调用

B-C
A-C
C-C
A-C
B-C
D-C
所有这些都是由D*D=newd;引起的

D构造函数调用C构造函数,因为C是D的基

然后,初始化类C的数据成员a和b,a是指针,因此还没有构造函数调用该数据成员。b是类型b的对象,因此会调用b无参数构造函数,从而得到第一个b-C

然后在C构造器中,你说新的A,它调用A的构造器,它给你A-C,后跟C-C

然后,初始化类D的数据成员a和b,它们都是对象,因此调用这两个构造函数,得到a-C和b-C


最后,调用D构造函数,以D-C结尾。

等等,为什么要先输出B-C?新的D调用C构造函数,C构造函数调用A构造函数。@GillBates nuh-huh。C有一个在构造函数主体之前初始化的B数据成员。@Quentin我以为C中的B数据成员是指针,我的错。@aschepler是的,op的意思是他得到了第二部分作为实际输出,只是措词不正确。看来我的讲师错了,哈哈,他说当这个类从另一个类继承时,在派生类构造函数之前只调用基类构造函数…他没有提到基类数据成员的初始化。非常感谢,您的意思是当该类从另一个类继承时,让D从C继承,它将首先初始化基类的数据成员,并在初始化数据成员后调用构造函数?@kelveng是的,没错。
B-C
A-C
C-C
A-C
B-C
D-C