草庐IT

c++ - 为什么虚拟基类必须由最派生的类来构造?

以下代码无法编译:classA{public:A(int){}};classB:virtualpublicA{public:B():A(0){}};//mostderivedclassclassC:publicB{public:C(){}//wrong!!!};如果我在C的构造函数初始化列表中调用A的构造函数,即://mostderivedclassclassC:publicB{public:C():A(0){}//OK!!!};确实有效。显然,原因是因为虚拟基类必须始终由大多数派生类构造。我不明白这个限制背后的原因。 最佳答案 因

c++ - 为什么使用虚拟基类会改变复制构造函数的行为

在以下程序中,a当B虚拟地从A派生并且复制C(不是B)的实例时,不会复制成员变量。#includeclassA{public:A(){a=0;printf("A()\n");}inta;};classB:virtualpublicA{};classC:publicB{public:C(){}C(constC&from):B(from){}};templatevoidtest(){Tt1;t1.a=3;printf("pre-copy\n");Tt2(t1);printf("post-copy\n");printf("t1.a=%d\n",t1.a);printf("t2.a=%d\n"

c++ - 为什么使用虚拟基类会改变复制构造函数的行为

在以下程序中,a当B虚拟地从A派生并且复制C(不是B)的实例时,不会复制成员变量。#includeclassA{public:A(){a=0;printf("A()\n");}inta;};classB:virtualpublicA{};classC:publicB{public:C(){}C(constC&from):B(from){}};templatevoidtest(){Tt1;t1.a=3;printf("pre-copy\n");Tt2(t1);printf("post-copy\n");printf("t1.a=%d\n",t1.a);printf("t2.a=%d\n"

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon

c++ - C++ 中 CV 限定的基类

在重构一些C++11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎不可能定义一个CV限定的(const、volatile或constvolatile)基类,例如:structA{inta=0;};structB:Aconst{};//ErrorherewithClangandGCC!但是,以下编译没有错误:structA{inta=0;};usingAC=Aconst;structB:AC{};//NOERRORHERE!?Qualifiersareignored.intmain(){Bb;b.a=42;//NOERRORmodifyingafieldofconstbase.ret

c++ - C++ 中 CV 限定的基类

在重构一些C++11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎不可能定义一个CV限定的(const、volatile或constvolatile)基类,例如:structA{inta=0;};structB:Aconst{};//ErrorherewithClangandGCC!但是,以下编译没有错误:structA{inta=0;};usingAC=Aconst;structB:AC{};//NOERRORHERE!?Qualifiersareignored.intmain(){Bb;b.a=42;//NOERRORmodifyingafieldofconstbase.ret

c++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi

c++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi

c++ - 在派生类中重载基类方法

我试图理解为什么以下代码无法编译,显然解决方案依赖于在派生类中明确声明对method_A的依赖。请引用以下代码:classBase{public:voidmethod_A(intparam,intparam2){std::cout"test.cpp",(S)为“Derived::method_A(int)”指定了错误数量的参数。阻止派生类知道其基类正在实现它试图重载的方法的技术原因是什么?我希望更好地了解编译器/链接器在这种情况下的行为方式。 最佳答案 它被称为名称隐藏。当您定义一个与Base方法同名的非虚拟方法时,它会隐藏Deri