我知道菱形继承会导致歧义,可以通过virtualBaseClasses使用继承来避免,问题不在于此。当类是多态时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:#includeusingnamespacestd;classBase{public:virtualvoiddoSomething(){}};classDerived1:publicvirtualBase{public:virtualvoiddoSomething(){}};classDerived2:publicvirtualBase{public:virtualvoiddoSomething(){}};cl
我有以下类层次结构:classBase{//Thisclasscannotbemodifiedpublic:Base(inta,intb,intc){if(a==100&&b==200&&cclassDerived在代码中用的很多地方,所以不能用某种工厂函数代替。现在的问题是是否有某种构造允许我在调用Base构造函数之前修复a、b、c值?我知道我可以使用如下函数:Derived(inta,intb,intc):Base(FixA(a),FixB(b),FixC(c)){}intFixA(inta){/*fixavalue*/returna;}intFixB(intb){/*fixbva
我有关注classbase{};classderived:publicbase{public:derived(){}voidmyFunc(){cout现在我有base*pbase=newderived();pbase->myFunc();我收到错误myFunc不是base的成员函数。如何避免这种情况?以及如何让myFunc被调用?注意我应该让基类不包含函数,因为它是设计的一部分,上面的代码是大函数的一部分 最佳答案 如果您坚持认为此函数不应成为base的一部分,那么您只有2个选择。要么使用指向派生类的指针derived*pDeriv
根据https://gcc.gnu.org/projects/cxx-status.html,g++版本7,与标志一起使用-std=c++1z,支持类模板的模板参数推导。我希望下面的代码能够编译,尤其是Base是一个抽象类,因此:1.编译器不知道Base的实例可以创建;2.指向基址的指针pt_base指向明确定义的实例(即Derived{42}),其中类型(int)是显式的。templateclassBase{public:virtualValueTypegetValue()=0;};templateclassDerived:publicBase{public:Derived(Valu
我觉得sizeof(Base)应该是12,为什么是16?没有虚函数,我得到4和8。classBase{public:inti;virtualvoidPrint(){cout预期结果:12,16实际结果:16,16 最佳答案 whysizeof(Base)isnotdifferentofsizeof(Derived)因为编译器引入了对齐。这是架构相关的,但为了简单起见,我假设我们指的是64位架构。Scenario64bit/Clang8.0.类型的对齐Base是8字节数:alignOfBase():#@alignOfBase()mov
请注意Derived类构造函数有ii作为它的第一个参数,但参数传递给了Base等于i故意。classBase{protected:inti;public:Base(inti):i(i){}};classDerived:publicBase{private:intk;public:Derived(intii,intk):Base(i),k(k){}//WhynotC2065:'i'undeclaredidentifier};intmain(){} 最佳答案 因为i是继承自Base的成员变量,所以是定义的。您可以自由访问初始化列表中的成
这似乎可行,但我不能100%确定它是否合法,希望得到一些反馈。我有一个从通用基类派生的子类。它类似于奇怪的重复出现的模板模式,但又有所不同。在derived.h中:templateclassDerived:publicT{public:Derived();...andsomeotherstuff...};在derived.cpp中:#include"derived.h"templateDerived::Derived(){...}//definingthevariationsIneedhereavoidslinkererrors//seehttp://www.parashift.com
编辑:与c++undefinedreferenceto`vtable有关我正在尝试做一个关于继承的项目,但我遇到了这个错误:/tmp/ccw1aT69.o:Infunction`main':main.cpp:(.text+0x15):undefinedreferenceto`Derived::Derived(int)'/tmp/ccw1aT69.o:Infunction`Derived::~Derived()':main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x13):undefinedreferenceto`vtableforD
我无法理解我用来学习C++的书中的代码到底发生了什么。这是代码:classBase{public:Base(){};virtual~Base(){};virtualBase*Clone(){returnnewBase(*this);}};classDerived{public:Derived(){};virtual~Derived(){};virtualBase*Clone(){returnnewDerived(*this);}};所以在这个Clone()函数我知道函数返回一个指向基类对象的指针。我不明白的是该功能中发生了什么。当我以前使用过new如int*pInt=newint,我的
在使用say时,C++中的标准字符串类。你需要#include吗在头文件和源文件上?你能不能只拥有#include只在头文件上? 最佳答案 包含在头文件中可能表示类定义级别的依赖性(例如,您正在接受或返回字符串)。在这种情况下,您必须将include放在标题中;但是,如果您只在实现中使用字符串,则可能只需要在源文件中包含。 关于c++-在头文件和源文件中包含相同的includederivate是标准做法吗?,我们在StackOverflow上找到一个类似的问题: