的問題是,你想要一個不同的類範圍比它在聲明的一箇中定義的功能。例如,考慮你的代碼的這一擴展版本:
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::B
或C::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_
基本上在普通類的內部類(具有在封閉類和訪問(可視性的範圍),以封閉的類的所有成員)。同樣的錯誤:'struct X {void f(); }; struct Y {void X :: f(){}};' –