2016-06-08 89 views
2

我具有低於在C情景++開發的C++無法從dericed類參數在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); 

} 

內運行以下錯誤即將後
[錯誤]衝突的聲明「基K」
[錯誤]'k'以前的聲明爲'int k'
爲什麼會出現此錯誤。
它的工作很好,當我調用基地(5)除了派生的構造函數中聲明的任何參數。
在此先感謝。

+0

「DEV C++」不是編譯器。 – DeiDei

+0

嗨,是它的臨時,我不初始化構造函數。但我想知道爲什麼base(5)或base(j)在derived()而不是base(i)內工作。 – Ryuk

回答

-1

main()

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

//創建顯式對象並傳遞整數參數,然後嘗試 也傳遞部分在derive-> base中的整數值。 中汲取

base(8); 

而且總是打印古怪程序中的變量作用的價值

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); 


} 
+0

請解釋一下這個答案。代碼只有答案大多沒有太大的價值。謝謝你!保持良好的工作! –

0

有什麼base(k)可能有兩種解釋:

  1. 它可能是在臨時創建
  2. 它可能是一個變量聲明:變量名可以在括號內

在這兩種選擇中,編譯器使用第二種選擇:如果某物可以是聲明或表達式,則選擇該聲明。這與most vexing parse有關,雖然不是這樣。其效果是,在您使用base(k);試圖定義一個名爲k類型base的變量。

您可以使用歧義的

一個
  1. (base(k));
  2. base{k};

如果base也有一個構造函數服用std::initializer_list<int>這兩個可以具有不同的含義的含義。