繼承:基類(父類)派生類(子類)
以animal(動物)eatgrassanimal(食草動物)rabbit(兔子)舉例
#include "stdafx.h"#include <iostream>
using namespace std;
class Animal //基類
{
public:
Animal(){ cout << "animal的默認構造函數" << endl; }
Animal(int age){ m_age = age; cout << "animal的定義構造函數"<< endl; }
int getAge(){ return m_age; }
void run(){ cout << "animal run" << endl; }
private:
int m_age;protected:
};
//繼承的3中方法,public protected private 不管是哪一種繼承,子類都包含了父類的所有的屬性和方法
不同點在於子類對於父類的訪問權限不同
{
public:
EatGrassAnimal(int age);
void eat(){ cout << "I am eat grass" << endl; }
int getAge(){ return m_age; }
private:
int m_age;
protected:
};
EatGrassAnimal::EatGrassAnimal(int age) :Animal(age) //構造函數初始化時 先執行初始化列表在執行函數體內部
{
m_age = 20; 派生類中初始化父類的數據成員,當然子類也可以繼續添加,初始化自己的數據成員
}
class Rabbit : public EatGrassAnimal
{
public:
Rabbit(int age);
int getAge(){ return m_age; }
private:
int m_age;
protected:
};
Rabbit::Rabbit(int age) :EatGrassAnimal(age) 這個地方子類只能調用自己的父類的構造函數,不能越級調用animal類
{
m_age = 30;
}
int _tmain(int argc, _TCHAR* argv[])
{
Rabbit rabbit(2); rabbit類定義了一個對象,構造函數調用的順序,先調用animal類,在調用eatgrassanimal 後調用rabbit類,析構函數調用的順序與構造函數 相反
rabbit.run();rabbit.eat();
cout << rabbit.getAge() << endl; 3個類中同時有getage成員函數時,就近原則
cout << rabbit.Animal::getAge() << endl; 若想調用具體的某一個類中的成員函數時,前面加類名和類限定符
cout << rabbit.EatGrassAnimal::getAge() << endl;cout << rabbit.Rabbit::getAge() << endl;
system("pause");
return 0;
}
3中繼承方式的區別:
如果不申明某種繼承方式時,默認private繼承
public: 父類中的public---->子類中的public protected->protected private 不可訪問
protected public ->protected protected->protected private不可訪問
父類的public變成子類的protected,外部無法訪問
private public-> private protected->protected private不可訪問