我在DEV c ++中的c ++中有以下场景
class base{
int i=0;
public:
base(){
cout<<"base default constructor"<<endl;
}
base(int i){
cout<<"base with int"<<endl;
}
};
class derive : public base{
int j;
public:
derive(){
cout<<"derive default";
}
derive(int i){
int k=5;
base(k);//////error
cout<<"derived with int "<<i<<endl;
}
void fun(int i){
cout<<"finction "<<i<<endl;
}
};
int main()
{
derive d(9);
}
运行后跟随错误即将来临
[错误]冲突声明&#39; base k&#39;
[错误]&#39; k&#39;有一个先前的声明为&#39; int k&#39;
为什么会出现这个错误。
当我使用除派生构造函数中声明的任何参数调用base(5)时,它工作正常
提前谢谢。
答案 0 :(得分:1)
如果在隐式参数的派生类中调用基础构造函数,则需要在field initialization list中完成,如下所示:
derive(int i) : base(i) {
cout<<"derived with int "<< i <<endl;
}
答案 1 :(得分:0)
#include <iostream>
using namespace std;
class base{
public:
base(){
cout<<"base default constructor"<<endl;
}
base(int i){
cout<<"base with int "<<i<<endl;
}
};
class derive : public base{
public:
int j;
int k;
derive(){
cout<<"derive default\n";
}
derive(int i){
k=5;
base(this->k);//////error
cout<<"derived with int "<<i<<endl;
}
void fun(int i){
cout<<"finction "<<i<<endl;
}
};
int main()
{
derive p(10);
}
答案 2 :(得分:0)
base(k)
可能有两种解释:
在这两个选项中,编译器使用第二个选项:如果某些内容可以是声明或表达式,则选择声明。这与most vexing parse有关,但并非如此。结果是,在您的使用中,base(k);
尝试定义类型为k
的名为base
的变量。
您可以使用
之一消除歧义(base(k));
base{k};
如果base
也有一个构造函数采用std::initializer_list<int>
这两个可能有不同的含义。
答案 3 :(得分:-1)
在main()
base b(3);
derive d(9);
base b1(2);
//创建显式对象并传递整数参数。然后尝试 也在derive-&gt; base中传递特定的整数值。 在派生
base(8);
并始终在程序中打印奇怪的变量值