今天看**時,遇到乙個問題:
#include using namespace std;
class point
virtual double area()const;
private:
double x,y;
};double point::area()const
class rectangle:public point;
rectangle::rectangle(int i,int j,int k,int l):point(i,j)
double rectangle::area() const
//void fun(point &s) 結果將如何?
void fun(point s){
cout<< "fun: " << s.area()《這裡傳引用和傳值有什麼區別呢?
其實傳值時就相當於,使用型別物件b(實參)去給型別物件a(形參)初始化。是不是有點熟悉了?
沒錯就是拷貝建構函式做的事情。雖然ab型別不一致。但是建立b物件的類型別是建立a物件的類型別的派生類。
這種情況下並不會產生型別不匹配的錯誤。
相反的會呼叫類型別a的拷貝建構函式對a初始化。那實參多出來的部分呢? 被消減了!
這就是多型中傳值的乙個問題——slicing(物件切割)問題。
當乙個 derived class(派生類)物件以 值傳遞方式並被視為乙個 基類的物件時,基類的拷貝建構函式會被呼叫,從而「造成此物件的行為像個 派生物件」的那些特化性質全被切割掉了,僅僅留下乙個 基類物件(因為正是 基類的建構函式建立了它)。
正是因為上面的原因,所以 值傳遞方式不會實現多型的。實現多型的方法就是 通過傳遞 指標或者引用,因為這樣傳遞的是 指向派生類的基類指標,派生類的特性會全部保留,不會因為切割而丟失。
C 類中乙個構造函式呼叫另乙個建構函式
class a a int aa,int bb,int cc 上面類中,已經有乙個建構函式,形參有兩個,我們又過載乙個有3個形參的建構函式,為了減少 量,就想著讓3個引數的構造函式呼叫2個引數的建構函式,然後在執行一些自己的 這就如同派生類先呼叫基類的同名函式,在執行自己特有的 這種機制如何實現呢?...
C 中乙個類成員函式呼叫另乙個類成員的方法
在繼承之外,在c 中乙個類成員函式呼叫另乙個類成員的方法主要有 類的組合,友元類,類的前向宣告,單例模式等,下面主要講講這4種方法的實現 組合通俗來講就是類b有類a的屬性,如宣告乙個person類,再宣告乙個teacher類,person類物件有年齡和姓名成員,而teacher類物件成員也有年齡和姓...
乙個類如何只建立乙個物件?
思路 由於只有全域性與靜態可以被類中所有成員使用,而類中存在靜態的成員變數 成員函式,由此考慮用靜態來解決。具體方法 建構函式只呼叫一次 將成員函式 構造 析構 定義為私有,定義靜態成員變數char s 所有變數所共有 再編寫 靜態 2個函式 建立與釋放函式 函式1功能 當s null new開闢空...