1. 只有當D公有繼承B時,用戶代碼才能使用派生類向基類的轉換;如果D私有繼承B的方式是受保護的或者私有的,則用戶代碼不能使用該轉換。
class A {};
class B : public A {}void function(const A&) {}int main()
{B b;function(b); // 這時就可以使用function(b),會默認把B類型轉換成A類型。
}
?
?
2. 不論D以什么方式繼承B,D的成員函數和友員函數都能使用派生類向基類的轉換;派生類向其直接基類的類型轉換對于派生類的成員函數和友員函數來說永遠是可訪問的
class B {}class D : private B //這里以private或者protected或者public 都可以
{void f(){B* base = new D; //編譯正確}
}
如果不是成員函數(即用戶代碼),例如:
class B {};
class D : private B {}; //如果這里是public就可以,private或protected會錯int main()
{B* b = new D; //會出現編譯錯誤,注意,這是用戶代碼
};
?
3. 如果D繼承B的方式是public或者protected,則D的派生類的成員或者友員可以使用D向B的類型轉換;反之,如果D繼承B的方式是private,則不能使用。
class B {};
class D : public B {}; //public或protected都可以class E : private D // 或者protected D或者public D
{void f(){B* b = new D; //可以編譯通過D* d = new E; //可以編譯通過,這就是2介紹的情況。}
};
?
?