我目前正在通过http://www.cplusplus.com教程,我在这里看到了这一部分:http://www.cplusplus.com/doc/tutorial/inheritance.html处理C++中友元函数和友元类的主题。我的问题是,什么时候在创建程序时使用友元是明智的?我得到的唯一线索是文章中的一个示例,该示例演示了一个“复制”对象的友元函数。 最佳答案 在MarshallCline的C++FAQLite中有一些非常好的经验法则.一切都很好,但请特别注意,"Dofriendsviolateencapsulation?
在C++中,如果将基类对象实例化为基对象,然后向下转换为派生对象,是否为未定义行为?当然,我会假设它绝对必须是未定义的行为,因为派生类对象可能有基类没有的成员变量。因此,如果类被实例化为基础对象,这些变量实际上不会存在,这意味着通过派生类指针访问它们将不得不导致未定义的行为。但是,如果Derived类只提供额外的成员函数,但不包含任何其他成员数据怎么办?例如:classBase{public:intx;};classDerived:publicBase{public:voidfoo();};intmain(){Baseb;Derived*d=static_cast(&b);d->foo
在c++中,可能声明内部类(CInner),使其具有外部类(COuter)作为其基类吗?这个问题是关于c++技术的。不是编程风格或个人喜好的问题。 最佳答案 是的。这编译:classCOuter{classCInner;};classCOuter::CInner:publicCOuter{};这是必需的原因是派生类要求整个定义都存在于它自己的定义中。所以你只需要确保在内部类的定义开始之前完全定义了外部类。 关于c++-内部类基类的特例,我们在StackOverflow上找到一个类似的问题
如果类继承了带有静态变量成员的基类,将是它们唯一的一个成员,与所有继承的类共享。我有几种继承类,每一种都有很多实例。我希望每个继承类都有一个单独的静态成员,并与其所有实例共享。如何实现?谢谢,抱歉我的英语不好。编辑:classa{staticintvar;};classb::a{};classc::a{};现在,我希望b的所有实例都具有相同的var,并且c的所有实例都具有相同的var,但是varb的>将不同于c的var。我再次对我的英语感到抱歉,如果你能纠正我,请纠正我。 最佳答案 您可以使用CRTP解决这个问题:structYou
有没有办法让通用代码通过基类指针访问派生类的成员?或者还有其他解决方法吗?假设我有一个Shape类。我有继承它的Square和Triangle类。两者都有自己的私有(private)成员,彼此无关,因此将它们放在基类中毫无意义。现在,如果我需要将类写入文件,但直到我需要将类写入文件时才知道该类是方形还是三角形怎么办?我一直在想办法解决这个问题。最坏的解决方案是将Square和Triangle的数据写入一个文件,为读取和写入添加一个标识符(Triangle或Square),并在加载数据时让一个小型解析器将类放在一起。这将是低效和浪费时间的。我想知道是否有一些技巧或设计模式或任何可以帮助解
假设我有一个基类classBase{public:Base();Base(inti,doublej);Base(inti,doublej,charch);virtualvoidprint();private:intm;doublel;charn;};我想派生一个重写打印函数的类,但除此之外与基类完全相同。classDerived:publicBase{public:voidprint();};有没有一种方法可以在派生类上使用基类的所有构造函数,而无需为派生类重写所有构造函数? 最佳答案 自C++11起,您可以为此使用using:cl
我有以下代码似乎会导致无限循环:structX{voidmy_func(int){std::cout它有什么问题? 最佳答案 第二位是无限递归的:structX2:X{voidmy_func(charvalue){my_func(value);}//callsitselfoverandoveragain};前缀my_func使用基类的名称就可以了structX2:X{voidmy_func(charvalue){X::my_func(value);}};EDIT刚刚意识到基类my_func的签名是不同的。C++编译器静态解析函数重载
我想做这样的事情:templateaddTri(Tv1,Tv2,Tv3){//Takev1.pos,v2.pos,v3.posandcreateageometricrepn..Triangletri(v1.pos,v2.pos,v3.pos);//allverticeswill//havetohavea.posmember.//Createthevertexbuffer..VertexBuffervb...}因为那行不通,这是我的解决方法..templateaddTri(Tv1,Tv2,Tv3){Vertex*p1=(Vertex*)&v1;//Thisisavery"shutupC+
我知道C++支持私有(private)继承,C#只支持公有继承。我还看到一篇文章说私有(private)继承通常定义类之间的HAS-A关系和某种聚合关系。编辑:私有(private)继承的C++代码:“Carhas-aEngine”关系也可以用私有(private)继承来表达:classEngine{public:Engine(intnumCylinders);voidstart();//StartsthisEngine};classCar:privateEngine{//Carhas-aEnginepublic:Car():Engine(8){}//InitializesthisCa
来自http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.5Amember(eitherdatamemberormemberfunction)declaredinaprotectedsectionofaclasscanonlybeaccessedbymemberfunctionsandfriendsofthatclass,andbymemberfunctionsandfriendsofderivedclasses那么,如何访问派生类中的protected函数fun呢?#includeusingna