Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基类的构造函数工作,但其效果被取消_C++_Oop_Inheritance_C++17 - Fatal编程技术网

C++ 基类的构造函数工作,但其效果被取消

C++ 基类的构造函数工作,但其效果被取消,c++,oop,inheritance,c++17,C++,Oop,Inheritance,C++17,我有以下代码: 项目.h 使用item\u t=char; constexpr item_t no_item='*'; constexpr item_t item1='a'; constexpr item_t item2='b'; bool ISTEM(施工项目和项目){ 退货项目==无项目| |项目==项目1 | |项目==项目2; } 阶级基础{ 公众: base():值(无项){} 基本(const item_t&item):值(item){} friend std::ostream和操作

我有以下代码:

项目.h

使用item\u t=char;
constexpr item_t no_item='*';
constexpr item_t item1='a';
constexpr item_t item2='b';
bool ISTEM(施工项目和项目){
退货项目==无项目| |项目==项目1 | |项目==项目2;
}
阶级基础{
公众:
base():值(无项){}
基本(const item_t&item):值(item){}
friend std::ostream和操作员
上面调用了
derivedTmp(item\u t item)
constructor


这将首先调用默认的基类构造函数,它是
base::base()
,它将
值设置为
无项
,即“*”。

可以调用基类构造函数的唯一位置,更不用说向其传递参数了,是从派生构造函数的

模板
类派生的TMP:公共基{
公众:
derivedTmp()=默认值;
derivedTmp(项目):基础(检查(项目)?项目:无项目){
};

代码不起作用的原因是,两个派生构造函数都在使用其无参数的默认构造函数初始化基类,该构造函数将
成员设置为
无项
。在
派生
构造函数主体内调用
构造函数不会重置基类类来更新
值。如果它甚至可以编译(在我尝试过的几个编译器中都没有),它将构建临时
对象,这些对象只是超出范围并立即被销毁,而调用的
派生的
对象保持不变。

If(!check(item)){base::base();}
-um.…这应该是什么?
base
派生的一部分已经被构造。您不能“重建”调用基的默认构造函数否则就调用另一个构造函数,怎么可能已经构造了基部分,我没有调用构造函数正如我说的,基类构造函数在您输入
{
的派生构造函数。你不能只是重做它。我很难看到一个带有默认引用的单个引用参数的构造函数如何不能解决你在这里真正想要完成的问题。@Linus“基部分怎么可能已经构造好了,我没有调用构造函数”-如果您没有从派生类构造函数的成员初始化列表显式调用基类构造函数,编译器将为您隐式调用基类的默认构造函数。基类总是在派生构造函数的主体开始运行之前完全构造。很抱歉,您错了,
deriveTmp(项目)
调用
base::base(val)
因为
!检查(val)
是错误的,请看一看以理解这一点。如果在派生类构造函数中没有调用正确的基类构造函数,则在创建派生对象的基组件时会调用默认的构造函数。啊,好的,当它开始执行大括号内的内容时,谢谢你
{…}
在构造函数中,默认的基本构造函数已经启动并完成。这是否意味着我应该使用赋值运算符?
const derived d1(item1);