草庐IT

继承权

全部标签

c++ - 虚拟析构函数和删除具有多重继承的对象......它是如何工作的?

首先,我理解为什么在单继承和通过基指针删除对象方面需要virtual析构函数。这特别是关于多重继承以及为什么这有效的原因。这个问题出现在我的一堂大学类(class)中,没有人(包括教授)知道为什么会这样:#includestructA{virtual~A(){std::cout这个的输出是:~AB~B~A~AB~B~A编译器如何知道在删除a或bA和B的析构函数?具体来说,AB的内存是如何布局的(特别是它的虚函数表),以便可以调用A和B析构函数?我的教授建议将内存布局(某种东西)如下:AB+---------++----+|AVFT|------>|~A|+---------++----

c++ - 虚拟析构函数和删除具有多重继承的对象......它是如何工作的?

首先,我理解为什么在单继承和通过基指针删除对象方面需要virtual析构函数。这特别是关于多重继承以及为什么这有效的原因。这个问题出现在我的一堂大学类(class)中,没有人(包括教授)知道为什么会这样:#includestructA{virtual~A(){std::cout这个的输出是:~AB~B~A~AB~B~A编译器如何知道在删除a或bA和B的析构函数?具体来说,AB的内存是如何布局的(特别是它的虚函数表),以便可以调用A和B析构函数?我的教授建议将内存布局(某种东西)如下:AB+---------++----+|AVFT|------>|~A|+---------++----

python singleton带有继承

我有一个单身人士:classClassStn(BaseClass):INSTANCE=Nonedef__init__(self,x1,args=None):ifself.INSTANCEisnotNone:raiseValueError("Aninstantiationalreadyexists!")#initializingBaseClass.__init__(self)self.x1=x1self.args=args@classmethoddefget_instance(cls,x1,args):ifcls.INSTANCEisNone:cls.INSTANCE=ClassStn(x1,a

c++ - 选择性继承 C++

您能否解释一下为什么以下代码可以编译并且工作正常(在gcc-4.3.4上检查)。我认为选择性继承不能削弱甚至加强对成员/方法的访问。不破坏封装规则吗?#includeclassA{protected:voidfoo(){std::cout 最佳答案 从语言的角度来看,这并没有什么问题(设计好不好是另外一回事)。任何类(class)都可以选择向更广泛的受众公开它可以访问的内容。原则上,您的示例与以下内容没有什么不同:classB:privateA{public:voidbar(){foo();}};除了这里foo()是通过代理暴露的。

c++ - 选择性继承 C++

您能否解释一下为什么以下代码可以编译并且工作正常(在gcc-4.3.4上检查)。我认为选择性继承不能削弱甚至加强对成员/方法的访问。不破坏封装规则吗?#includeclassA{protected:voidfoo(){std::cout 最佳答案 从语言的角度来看,这并没有什么问题(设计好不好是另外一回事)。任何类(class)都可以选择向更广泛的受众公开它可以访问的内容。原则上,您的示例与以下内容没有什么不同:classB:privateA{public:voidbar(){foo();}};除了这里foo()是通过代理暴露的。

c++ - 私有(private)范围内私有(private)继承的动态向下转换

对thisquestion的调整我遇到的。考虑:classA{};classB:privateA{staticvoidfoo();};voidB::foo(){B*bPtr1=newB;A*aPtr1=dynamic_cast(bPtr1);//givespointerB*bPtr2=dynamic_cast(aPtr1);//givesNULL}因为aPtr1实际上属于B*类型,并且我们可以完全访问B及其继承自A,我希望这两个Actor都能工作。但他们没有;为什么?还有其他方法可以实现这种Actor吗?注意:如果foo()不是B的成员,则两个强制转换都会失败。如果B公开继承自A,则两

c++ - 私有(private)范围内私有(private)继承的动态向下转换

对thisquestion的调整我遇到的。考虑:classA{};classB:privateA{staticvoidfoo();};voidB::foo(){B*bPtr1=newB;A*aPtr1=dynamic_cast(bPtr1);//givespointerB*bPtr2=dynamic_cast(aPtr1);//givesNULL}因为aPtr1实际上属于B*类型,并且我们可以完全访问B及其继承自A,我希望这两个Actor都能工作。但他们没有;为什么?还有其他方法可以实现这种Actor吗?注意:如果foo()不是B的成员,则两个强制转换都会失败。如果B公开继承自A,则两

C++:从模板参数继承类

我最近看到了以下C++代码片段templateclassA:publicB{...};我想知道在哪种情况下这样的设计是好的做法?我的理解是,将父类(superclass)作为模板参数允许A的用户在实例化A的对象时选择父类(superclass)。但如果是这种情况,为所有用作模板参数的类(B)使用一个公共(public)父类(superclass)C不是更好吗?并让A扩展C? 最佳答案 常用于实现staticpolymorphism.用例是:Policy-baseddesignCuriouslyrecurringtemplatepat

C++:从模板参数继承类

我最近看到了以下C++代码片段templateclassA:publicB{...};我想知道在哪种情况下这样的设计是好的做法?我的理解是,将父类(superclass)作为模板参数允许A的用户在实例化A的对象时选择父类(superclass)。但如果是这种情况,为所有用作模板参数的类(B)使用一个公共(public)父类(superclass)C不是更好吗?并让A扩展C? 最佳答案 常用于实现staticpolymorphism.用例是:Policy-baseddesignCuriouslyrecurringtemplatepat

c++ - 私有(private)继承隐藏基类,出现 "inaccessible within this context"错误

我遇到了类似于Privateinheritancerendersclassinaccessible中描述的问题当我尝试在派生类中声明基类的成员时,私有(private)继承的基类给出“在此上下文中不可访问”错误。在上述情况下,使用::X显式引用X是可行的,但如果代码位于以下函数中会怎样:voidfooby(){classX{};classY:privateX{};classZ:publicY{public:Xx;//Compiler"inaccessiblewithinthiscontext"error};};在这种情况下你如何引用X?如果fooby是一个结构/类,那么::fooby: