关于ctor / dtor行为与继承类的混淆

直到今天,我还以为我对继承的了解比我明显要好得多。此示例的目标是设计一个n个类的框架(在这种情况下为3个),每个类在程序的生命周期中应该唯一地存在。第四类(其实现将包含全局main函数)将负责处理其他类的内存。另外,我希望对基类中的公共成员进行保护,以防止其他任何类调用它们。

当前,在每个基类中,注释掉了“ Main”类中的继承以及“ protected:”关键字。它并不能完全满足我的要求,但一切都可以正常进行。构造函数被调用一次(以升序排列),每个函数都被调用,随后是析构函数。

我在这里的困惑实际上是两方面。如果取消对Main类中的继承的注释,则将编译代码,但新的每个ctor / dtor都会被调用两次,首先是升序,然后是降序。我一直无法推理为什么会发生这种情况,但似乎并不正确。我见过的每一种关于继承的解释都是模糊的,并不能解释为什么这种情况需要发生。

class Main //: public A,public B,public C

我的第二个困惑点是类的受保护成员。我认为如果取消注释“ protected:”关键字,在基类中继续方法,我应该能够从继承的类中调用它们。据我了解,假设我只希望孩子具有此功能,我甚至应该能够将它们继承为私有。 las,我只是收到有关受保护方法的错误消息。

我很清楚自己的理解存在一些重大不足,但是我一直在尽力寻找一个没有运气的解释。我真的可以对这里发生的事情使用一些建设性的见识,

谢谢

#include <iostream>
#include <memory>
using namespace std;

class A
{
    public:
    A() { cout << "Ctor A\n";} 
    ~A() { cout << "Dtor A\n";} 

    //protected:
    void func() { cout << "Function A\n"; }
};

class B
{
    public:
    B() { cout << "Ctor B\n";}
    ~B() { cout << "Dtor B\n";} 

    //protected:
    void func() { cout << "Function B\n"; }
};

class C
{
    public:
    C() { cout << "Ctor C\n";} 
    ~C() { cout << "Dtor C\n";}

    //protected:
    void func() { cout << "Function C\n"; }
};

class Main //: public A,public C
{
    public:
    Main(A *a,B *b,C *c);
    private:
    std::unique_ptr<A> mA;
    std::unique_ptr<B> mB;
    std::unique_ptr<C> mC;
};

Main::Main(A *a,C *c) : mA(a),mB(b),mC(c)
{
    mA->func();
    mB->func();
    mC->func();
}

int main()
{
    Main m(new A,new B,new C);
    return 0;
}

万一有人好奇,我一直在尝试使用gcc v8.3编译器在ideone.com上进行编译。

Jack2090 回答:关于ctor / dtor行为与继承类的混淆

如果在Main类中取消对继承的注释,则将编译代码,但是新的每个ctor / dtor都会被调用两次,首先是升序,然后是降序。我一直无法推理为什么会发生这种情况,但似乎并不正确。我见过的每一种关于继承的解释都是模糊的,并不能解释为什么这种情况需要发生。

您有三个呼叫ExternalResourceReference的电话。然后,构造一个new,这需要构造一个Main,一个A和一个B。由于C 的实例是MainAB的实例,因此必须调用这三个构造函数来构造有效的这三种类型的实例。

我认为,如果我取消注释“ protected:”关键字,继续在基类中使用方法,则应该能够从继承的类中调用它们。

当然可以,但是不能在甚至不是派生类型的类的任意实例上使用!你有:

C

这在类mA->func(); 的成员函数中,但在不是类Main的实例的对象上进行操作。类Main作为类Main的实例具有对自身的特殊访问权-其内部接口可以将自身的A函数用作类protected的实例,但这是它。

本文链接:https://www.f2er.com/2828110.html

大家都在问