2016-06-29 101 views
2
#include<iostream> 
using namespace std; 
class A{ 
    public: 
     class B{ 
      public: 
       void fun1(); 
     }; 
}; 

class C:public A{ 
    public: 
     B::fun1(){ // This line gives Error:can not define member function B::fun1() in C 

     }  
}; 
int main(){ 
    C ob; 
    return 0; 
} 

有什麼辦法可以在派生類中定義內部類成員? 這個錯誤背後的原因是什麼?如何在派生類中定義內部類成員?

+0

基本上在普通類的內部類(具有在封閉類和訪問(可視性的範圍),以封閉的類的所有成員)。同樣的錯誤:'struct X {void f(); }; struct Y {void X :: f(){}};' –

回答

2

的問題是,你想要一個不同的類範圍比它在聲明的一箇中定義的功能。例如,考慮你的代碼的這一擴展版本:

class A{ 
    public: 
     class B{ 
      public: 
       void fun1(); 
       void fun2(); 
     }; 

     void fun3(); 

     void B::fun2() {} // Error. 
}; 

class C:public A{ 
    public: 
     void B::fun1() {} // Error. 
     void A::fun3() {} // Error. 
}; 

所有三個錯誤將給出相同類型的錯誤消息「Can not define member function X::Y() in Z」。


爲了解決這個問題,如果A::B::fun1()C::B::fun1()需要有不同的實現方式,可以從嵌套類派生的,也是如此。

class A { 
    public: 
    class AB_ { 
     public: 
     virtual void fun1(); 
    }; 

    typedef AB_ B; 
}; 
void A::AB_::fun1() {} 

class C : public A { 
    public: 
    class CB_ : public A::AB_ { 
     void fun1() override; 
    }; 

    typedef CB_ B; 
}; 
void C::CB_::fun1() {} 

在這種情況下,你可以使用B外部訪問嵌套類的最衍生版本,或者直接使用A::AB_C::CB_。同樣,你可以寫這樣的事情:

class A { 
    class AB_ { 
     public: 
     virtual void fun1(); 
    } b; 

    public: 
    typedef AB_ B; 

    virtual B& getB() { return b; } 
}; 
void A::AB_::fun1() {} 

class C : public A { 
    // Note the use of the typedef, instead of the actual type name. 
    class CB_ : public A::B { 
     void fun1() override; 
    } cb; 

    public: 
    typedef CB_ B; 

    // Note the use of the typedef, instead of the actual type name. 
    A::B& getB() override { return cb; } 
}; 
void C::CB_::fun1() {} 

在這種情況下,C內部使用A的類型定義,同時代替它;由於這個原因,使用A的typedef被明確表示爲A::B而不是B。由於typedef,名稱B將分別表示爲A::AB_C::CB_,分別用作A::BC::B

// If given the above... 

int main() { 
    std::cout << "A::B: " << typeid(A::B).name() << std::endl; 
    std::cout << "C::B: " << typeid(C::B).name() << std::endl; 
} 

的輸出將是:

// GCC: 
A::B: N1A3AB_E 
C::B: N1C3CB_E 

// MSVC: 
A::B: class A::AB_ 
C::B: class C::CB_ 
相關問題