关于带有继承类的ctor / dtor行为的困惑

问题描述 投票:0回答:1

直到今天,我还以为我对继承的了解比我明显要好得多。此示例的目标是设计一个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 B, 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, B *b, 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上进行编译。

c++ inheritance constructor protected
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.