C++中的虛繼承的構造
多繼承中被當做基類來虛繼承的類是虛基類。
虛基類:使用關鍵字virtual繼承的基類。即使同一類在層次中作為虛基類出現多次,派生類物件中虛基類部分也只出現一次。在非虛基類中,建構函式只能初始化自己的直接基類,當對一個類進行虛繼承的時候,由最底層的派生類初始化那個類,因此最底層的派生類應包含用於其他所有虛父類的初始化式。
在這裡有四個類:Point ,PointA,PointB,DerivedPoint。我給出標頭檔案,不用給出原始檔了:
- class Point
- {
- public:
- Point();
- virtual ~Point();
- int x,y;
- };
- #include"Point.h"
- class PointA :public virtual Point
- {
- public:
- PointA();
- virtual ~PointA();
- int a;
- };
- #include"Point.h"
- class PointB :public virtual Point
- {
- public:
- PointB();
- virtual ~PointB();
- int b;
- };
- #include"PointA.h"
- #include"PointB.h"
- class DerivedPoint :public PointA,public PointB
- {
- public:
- DerivedPoint();
- virtual ~DerivedPoint();
- int d;
- };
PointA和PointB虛繼承Point,DerivedPoint繼承自PointA與PointB。
假定通過多個派生路徑繼承名為X的成員,有下面三種可能性:
1.如果在每個路徑中X表示同一個虛基類成員,則沒有二義性,因為共享該成員的單個例項。
2.如果在某個路徑中X為虛基類成員,而在另一路徑中X是後代派生類成員,也沒有二義性------特定派生類例項的優先順序高於共享虛基類例項。
3.如果沿每個繼承路徑X表示後代派生類的不同成員,則該成員的直接訪問是二義性的。
特殊的初始化語意
從具有虛基類的類繼承的類對初始化進行了特殊的處理。在虛派生中由最底層派生類的建構函式初始化虛基類
雖然由最底層派生類初始化虛基類,但是任何直接或者間接繼承虛基類的類一般也必須為該基類提供自己的初始化式。只要可以建立虛基類派生類型別的物件,該類就必須初始化自己的虛基類部分,這些初始化式只在建立中間型別物件時使用。
有了以上的規則,我的類就應該如下寫:
- class Point
- {
- public:
- Point();
- Point(int x,int y){this->x=x;this->y=y;};
- virtual ~Point();
- int x,y;
- };
- #include"Point.h"
- class PointA :public virtual Point
- {
- public:
- PointA();
- PointA(int x,int y,int a):Point(x,y),a(a)
- {};
- virtual ~PointA();
- int a;
- };
- #include"Point.h"
- class PointB :public virtual Point
- {
- public:
- PointB();
- PointB(int x,int y,int b):Point(x,y){this->b=b;};
- virtual ~PointB();
- int b;
- };
- #include"PointA.h"
- #include"PointB.h"
- class DerivedPoint :public PointA,public PointB
- {
- public:
- DerivedPoint();
- DerivedPoint(int x,int y,int a,int b,int d):PointA(x,y,a),PointB(x,y,b),Point(x,y),d(d){};
- virtual ~DerivedPoint();
- int d;
- };
在主函式中呼叫如下:
-
#include
- #include "DerivedPoint.h"
- using namespace std;
- void main()
- {
- DerivedPoint pt(1,2,3,4,5);
-
cout<
- }
列印結果正常。
在這裡首先構造虛基類,再構造PointA,PointB,DerivedPoint。在PointA和PointB中構造虛基類的呼叫被忽略。如果在DrivedPoint的建構函式中不顯示呼叫Point的建構函式,就呼叫Point的預設建構函式,如果Point沒有預設的建構函式,程式碼出錯。
注意:虛基類的建構函式一定是最先呼叫
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1131012/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【C++】 46_繼承中的構造與析構C++繼承
- 繼承中構造方法的特點繼承構造方法
- C++中的繼承C++繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- c++中的繼承關係C++繼承
- 菱形繼承,虛繼承繼承
- java——繼承遇到構造方法Java繼承構造方法
- 繼承中的建構函式繼承函式
- C++知識點49——類繼承與類的構造、拷貝、operator=和解構函式C++繼承函式
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- 詳解C++中繼承的基本內容C++中繼繼承
- C++繼承C++繼承
- C++虛繼承原理與類佈局分析C++繼承
- C++ 虛繼承 物件記憶體佈局C++繼承物件記憶體
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- JS中的繼承JS繼承
- java中的繼承Java繼承
- PostgreSQL中的繼承SQL繼承
- JavaScript中的繼承JavaScript繼承
- Solidity中的繼承Solid繼承
- C++ | 類繼承C++繼承
- C++繼承時的修飾符C++繼承
- C++的核心特性:繼承機制C++繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- JS中的繼承(下)JS繼承
- 聊聊JS中的繼承JS繼承
- JS中的繼承(上)JS繼承
- C++繼承體系C++繼承
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- js建構函式的繼承JS函式繼承
- C++ 多級繼承與多重繼承:程式碼組織與靈活性的平衡C++繼承
- JS中繼承的實現JS中繼繼承
- JavaScript中的六種繼承JavaScript繼承
- JavaScript中的函式繼承JavaScript函式繼承
- 淺談JavaScript中的繼承JavaScript繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- C++標準庫中檔案流類的繼承關係C++繼承
- 菱形繼承與虛基類繼承