-
父子關系 成員同名 隱藏
查看全部 -
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?* 定義人類: Person
?*/
class Person
{
public:
??? Person()
?? ?{
?? ??? ?cout << "Person" << endl;
?? ?}
?? ?~Person()
?? ?{
?? ??? ?cout << "~Person" << endl;
?? ?}
?? ?void eat()
?? ?{
?? ??? ?cout << "eat" << endl;
?? ?}
};
/**
?* 定義工人類: Worker
?* 虛繼承人類
?*/
class Worker : virtual public Person
{
public:
?? ?Worker(string name)
?? ?{
?? ??? ?m_strName = name;
?? ??? ?cout << "Worker" << endl;
?? ?}
?? ?~Worker()
?? ?{
?? ??? ?cout << "~Worker" << endl;
?? ?}
?? ?void work()
?? ?{
?? ??? ?cout << m_strName << endl;
?? ??? ?cout << "work" << endl;
?? ?}
protected:
?? ?string m_strName;
};
/**
?* 定義兒童類:Children
?* 虛繼承人類
?*/
class Children : virtual public Person
{
public:
?? ?Children(int age)
?? ?{
?? ??? ?m_iAge = age;
?? ??? ?cout << "Children" << endl;
?? ?}?? ?
?? ?~Children()
?? ?{
?? ??? ?cout << "~Children" << endl;
?? ?}?? ?
?? ?void play()
?? ?{
?? ??? ?cout << m_iAge << endl;
?? ??? ?cout << "play" << endl;
?? ?}
protected:
?? ?int m_iAge;
};
/**
?* 定義童工類:ChildLabourer
?* 公有繼承工人類和兒童類
?*/
class ChildLabourer:public Worker,public Children
{
public:
?? ?ChildLabourer(string name, int age):Worker(name),Children(age)
?? ?{
?? ??? ?cout << "ChildLabourer" << endl;
?? ?}
?? ?~ChildLabourer()
?? ?{
?? ??? ?cout << "~ChildLabourer" << endl;
?? ?}?? ?
};
int main(void)
{
??? // 用new關鍵字實例化童工類對象
?? ?ChildLabourer *p = new ChildLabourer("Jim",13);
??? // 調用童工類對象各方法。
?? ?p->eat();
?? ?p->work();
?? ?p->play();
?? ?delete p;
?? ?p = NULL;
?? ?return 0;
}查看全部 -
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?* 定義工人類: Worker
?* 數據成員: m_strName
?* 成員函數: work()
?*/
class Worker
{
public:
??? Worker(string name)
?? ?{
?? ??? ?m_strName = name;
?? ??? ?cout << "Worker" << endl;
?? ?}
?? ?~Worker()
?? ?{
?? ??? ?cout << "~Worker" << endl;
?? ?}
?? ?void work()
?? ?{
?? ??? ?cout << m_strName << endl;
?? ??? ?cout << "work" << endl;
?? ?}
protected:
?? ?string m_strName;
};
/**
?* 定義兒童類: Children
?* 數據成員: m_iAge
?* 成員函數: play()
?*/
class Children
{
public:
?? ?Children(int age)
?? ?{
?? ??? ?m_iAge = age;
?? ??? ?cout << "Children" << endl;
?? ?}?? ?
?? ?~Children()
?? ?{
?? ??? ?cout << "~Children" << endl;
?? ?}?? ?
?? ?void play()
?? ?{
?? ??? ?cout << m_iAge << endl;
?? ??? ?cout << "play" << endl;
?? ?}
protected:
?? ?int m_iAge;
};
/**
?* 定義童工類: ChildLabourer
?* 公有繼承工人類和兒童類
?*/
class ChildLabourer : public Worker,public Children
{
public:
?? ?ChildLabourer(string name, int age):Worker(name),Children(age)
?? ?{
?? ??? ?cout << "ChildLabourer" << endl;
?? ?}
?? ?~ChildLabourer()
?? ?{
?? ??? ?cout << "~ChildLabourer" << endl;
?? ?}?? ?
};
int main(void)
{
??? // 使用new關鍵字創建童工類對象
?? ?ChildLabourer *childLabourer = new ChildLabourer("sam",12);
??? // 通過童工對象調用父類的work()和play()方法
?? ?childLabourer->work();
?? ?childLabourer->play();
??? // 釋放
??? delete childLabourer;
??? childLabourer = NULL;
?? ?return 0;
}查看全部 -
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?* 定義人的類: Person
?* 數據成員姓名: m_strName
?* 成員函數: eat()
?*/
class Person
{
public:
??? string m_strName;
?? ?void eat()
?? ?{
?? ??? ?cout << "eat" << endl;
?? ?}
};
/**
?* 定義士兵類: Soldier
?* 士兵類公有繼承人類: public
?* 數據成員編號: m_strCode
?* 成員函數: attack()
?*/
class Soldier:public Person
{
public:
?? ?string m_strCode;
?? ?void attack()
?? ?{
?? ??? ?cout << "fire!!!" << endl;
?? ?}
};
int main(void)
{
??? // 創建Soldier對象
?? ?Soldier soldier;
??? // 給對象屬性賦值
??? soldier.m_strName = "Jim";
?? ?soldier.m_strCode = "592";
??? // 打印對象屬性值
?? ?cout << soldier.m_strName << endl;
?? ?cout << soldier.m_strCode << endl;
??? // 調用對象方法
?? ?soldier.eat();
?? ?soldier.attack();
?? ?
?? ?return 0;
}查看全部 -
不同繼承方式下,對于數據成員訪問的情況
查看全部 -
保護繼承方式
查看全部 -
公有繼承方式
查看全部 -
由代碼可知此時頂層父類的參數沒有改變,即頂層父類無法從子類中獲得傳入參數
查看全部 -
虛繼承(加上virtual關鍵字)后,Person()構造函數僅執行一次,注意順序
查看全部 -
注意構造/析構函數調用順序(普通繼承,非虛繼承)
查看全部 -
#ifndef #define …… #endif
宏定義解決重定義類的問題
查看全部 -
B public繼承 A:
A public --> B public
A protected --> B protected
A private --> B 不可訪問
B protected繼承 A:
A public,protected --> B protected
A private --> B無法訪問
B private繼承A:
A public,protected -->B private
A private --> B無法訪問
查看全部 -
先調用基類構造函數(按初始化列表順序),再調用子類構造函數
查看全部 -
test1 以對象為參數,會實例化一個對象副本并在函數結束時自動銷毀;
test2?以引用為參數,不會產生新的對象,只是產生一個引用,因此不會調用構造/析構函數;
test3?以指針為參數,使用時以&p為參數,結果與test2相同
查看全部 -
子類與父類間同名函數只能進行隱藏,不能進行重載!
查看全部
舉報