C++创建 可以实例化但不能继承的类
生活随笔
收集整理的這篇文章主要介紹了
C++创建 可以实例化但不能继承的类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class vb{
private:???
?? vb(){}?
friend C;???
} ??
//vb這個是一個基類,它的構造函數是private,因此它根本就無法被創建。但是我們顯式增加了一個friend C。因此只有C才能創建vb。這是關鍵點。???
class C:virtual public vb{???
};
//C虛擬繼承自vb,這樣在構造C的時侯,需要調用vb的默認構造函數,雖然vb的構造函數是private的,但是由于C是vb的friend,因此我們可以自由的在棧上,堆上建立C的實例。例如:?
C c;
C *pc = new C;?
都沒有問題。?
但是下面我們會看到,C已經成了一個final class,它無法在被任何其他class繼承。???
例如:?
class D : public C //編譯錯誤???
D嘗試繼承自C,C又虛擬繼承了vb,虛擬繼承的一個特性是,被虛擬繼承的基類(指vb)總是在派生層次最深的類(指D)中構造,因此D需要訪問vb的構造函數才能將自己建立起來。由于vb的構造函數是private,而且僅僅指定了唯一的一個friend C,因此D是無權訪問vb::vb(),也就根本無法通過編譯。???
這樣,C也成為了一個無法被繼承的類。vb和虛擬繼承是它的一個實現手法。
#include <iostream>
using namespace std;
class va?
{
friend class vb;
private:
va(){}
~va(){}
};
class vb:public virtual va{};
class vc:public vb {};
int main()
{
vc a;//實例化才報錯,虛擬集成會跳過vb的構造函數,去執行va的,但是vc不是va的友元
}
總結
以上是生活随笔為你收集整理的C++创建 可以实例化但不能继承的类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的空类,编译器默认可以产生哪些成
- 下一篇: CopyFile and Directo