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