无法使用c ++中的参数从dericed类调用基类构造函数

时间:2016-06-08 05:20:32

标签: c++ inheritance constructor visibility derived-class

我在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)时,它工作正常 提前谢谢。

4 个答案:

答案 0 :(得分:1)

如果在隐式参数的派生类中调用基础构造函数,则需要在field initialization list中完成,如下所示:

    derive(int i) : base(i) {
        cout<<"derived with int "<< i <<endl;
    }

live demo

答案 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)可能有两种解释:

  1. 它可能是临时的创建
  2. 它可以是变量声明:变量名称可以在括号中
  3. 在这两个选项中,编译器使用第二个选项:如果某些内容可以是声明或表达式,则选择声明。这与most vexing parse有关,但并非如此。结果是,在您的使用中,base(k);尝试定义类型为k的名为base的变量。

    您可以使用

    之一消除歧义
    1. (base(k));
    2. base{k};
    3. 如果base也有一个构造函数采用std::initializer_list<int>这两个可能有不同的含义。

答案 3 :(得分:-1)

main()

    base b(3);
    derive d(9);
    base b1(2);

//创建显式对象并传递整数参数。然后尝试 也在derive-&gt; base中传递特定的整数值。 在派生

base(8);

并始终在程序中打印奇怪的变量值