草庐IT

继承权

全部标签

C++简单的继承问题

#includeusingnamespacestd;classA{protected:inta;};classB:publicA{public:intfunc(A*p){couta;}};我真的不明白为什么我不能通过'p->a'访问'a'。是否可以在不将“protected”更改为“公共(public)”的情况下访问B类中p的成员“a”? 最佳答案 关于这个主题,C++03标准声明(强调我的):11.5Protectedmemberaccess1Whenafriendoramemberfunctionofaderivedclassr

在堆栈上分配对象时的 C++ 继承错误

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whyisitanerrortouseanemptysetofbracketstocallaconstructorwithnoarguments?我有小代码示例:#includeusingnamespacestd;classA{public:voidprint(){cout但是,如果我改成下面的那个,如果可行的话,B*b=newB();b->print();为什么在堆栈上分配对象时它不起作用?

C++ 继承,隐藏的基本方法

我有一个简单的C++基类、派生类示例。//Base.hpp#pragmaonceclassBase{public:virtualfloatgetData();virtualvoidsetData(floata,floatb);virtualvoidsetData(floatd);protected:floatdata;};//Base.cpp#include"stdafx.h"#include"Base.hpp"floatBase::getData(){returndata;}voidBase::setData(floata,floatb){setData(a);}voidBase::

c++ - 是否可以检查是否为类定义了成员函数,即使成员是从未知基类继承的

我发现类似的问题和答案,如thisone.但是,正如我所尝试的那样,只有在被测试的成员直接定义在被测试的类中时,这个SFINAE测试才会成功。例如下面的类B,D1打印HAS而其他两个打印NOTHAS。有没有办法判断一个类是否有成员,是自己定义的,还是基类定义的,这种情况下不知道基类的名字。动机是我想编写一个通用函数,如果它存在,它将调用某个方法(无论是否来自基类,参数的类型都是通用的,保留其可能基类的类型)。#includeclassHasFoo{public:typedefcharSmall;typedefstruct{char;char;}Large;templateclassSF

c++ - 继承只为代码重用c++

我有A类和B类。现在我需要编写一个新的C类,它将使用A和B中的一些字段和方法,但不是全部。(我将使用A和B中大约50%的东西)。现在我正在考虑从A和B继承。但这会使C包含很多没有意义的字段和方法。基本上我只是为了代码重用目的才使用继承,否则我将不得不从A和B复制和粘贴许多行代码。这种做法真的不好吗?有不同的方法吗?谢谢! 最佳答案 继承没有“是a的一半”的概念,所以绝对不是去这里的方式。这听起来像是组合的主要案例。听起来A和B有不止一个“功能”,因为它们各有一半足以组成一个C。我不确定这是否适用于您的情况,但考虑将A分成两部分,A1

c++ - 这有可能继承私有(private)类但使成员公开吗?

我想让成员继承私有(private)。我想我看到了一个将它们公开的例子,尽管如此,这个事实是用private关键字派生的。我的问题:如何去做,如果可能的话,难道不应该禁止吗?classU{public:inta;protected:intb;private:intc;};classV:privateU{public:inti;//canmakeapublicagain?}; 最佳答案 您不能将c公开,因为它对U是私有(private)的,并且不能从V访问(此外,这样的设计会require这可能是有缺陷的,因为它会违反封装-一个类不应

c++ - 为什么通过公开继承另一个类来构建一个类是一种糟糕的做法?

我正在为我的OOP期末学习,遇到了一个让我有点难过的问题。问题是“解释为什么通过公开继承List类来构建Stack类是一种糟糕的方法。描述一个更好的解决方案。”我不确定我的回答是否正确,但是否因为“公开继承...”?并且最好改为私有(private)继承,这样除了Stack之外没有其他类知道继承? 最佳答案 如果派生类公开继承自基类,则派生类是基类的一个实例,可能具有一些额外的功能或重写的功能。在堆栈和列表的情况下,堆栈不是列表-它在逻辑上不执行列表操作,如搜索、连接、反转等-因此从列表继承不是一个好主意。您可以在这里使用私有(pr

C++ 覆盖继承的方法

我有以下两个类。由于Child继承自Father,我认为Child::init()覆盖了Father::init().为什么,当我运行程序时,我得到的是“我是父亲”而不是“我是child”?如何执行Child::init()?您可以在这里进行测试:https://ideone.com/6jFCRm#includeusingnamespacestd;classFather{public:voidstart(){this->init();};voidinit(){cout 最佳答案 目前Child::init正在隐藏Father::in

c++ - 继承 : expected class-name before ‘{’ token

我试图在C++中创建一个异常类,但它不起作用。我已将代码减少到最少,但仍然找不到错误。这是我的头文件:#ifndefLISTEXCEPTION_H#defineLISTEXCEPTION_H//C++standardlibraries#include/*CLASSDEFINITION*/classListException:publicexception{};#endif//LISTEXCEPTION_H这是我得到的错误:error:expectedclass-namebefore‘{’token这是出乎意料的。我该如何解决这个问题? 最佳答案

c++ - 复制构造继承

structA{virtualvoidwhat(){cout为什么不是b2.m=50?我正在尝试复制一个b对象,并且我有复制构造函数B(constA&x):m(50)。我是否需要为派生类ass复制一个c'tor?像B(constB&x)??我认为既然b对象有一部分,我们可以使用B(constA&x):m(50)而不是默认构造函数::S​​如果你有一个带有A对象参数的函数,你可以传入一个B对象。它与复制构造函数有何不同? 最佳答案 原因是B(constA&x)不是复制构造函数—T类型的复制构造函数必须始终采用对T的左值引用作为第一个(