1.這里有基本的類繼承,屬性和方法訪問控制權限測試.
2.protected 這個屬性不能在類的外部訪問.這個需要注意.
3.在繼承過程中,并且,父類的成員變量中有其他對象,多個類的構造和析構方法調用順序
4.靜態成員 初始化的標準寫法 以及在派生類中如何調用
5.子類和父類 同名變量和函數的調用.這里需要理解內存四區,子類和父類成員變量和函數的存儲位置.
//
// main.cpp
// C++訪問控制測試
//
// Created by 扆佳梁 on 16/8/1.
// Copyright ? 2016年 Eric. All rights reserved.
//
#include <iostream>
using namespace std;
class A{
public:
int a = 0;
void setB(int b){
this->b = b;
}
protected: //不能被類對象訪問
int b = 0;
private:
int c = 0;
};
class B:public A{
public:
void printB(){
printf("%d\n",b);//子類public 繼承父類,可以使用父類的protected 對象
}
};
class C:private A{
public:
void printB(){
printf("%d\n",b);
}
};
/**
* 在子類對象構造時,需要調用父類構造函數對其繼承得來的成員進行初始化
在子類對象析構時,需要調用父類析構函數對其繼承得來的成員進行清理
1、子類對象在創建時會首先調用父類的構造函數
2、父類構造函數執行結束后,執行子類的構造函數
*3、當父類的構造函數有參數時,需要在子類的初始化列表中顯示調用
4、析構函數調用的先后順序與構造函數相反 先析構自己的,再析構父類
3.3.4繼承與組合混搭情況下,構造和析構調用原則 就是當一個類對象作為父類屬性的時候 ,
原則:
先構造父類,再構造成員變量、最后構造自己
先析構自己,在析構成員變量、最后析構父類
*
*/
/**
* 同名成員變量 和 成員函數 總結:同名成員變量和成員函數通過作用域分辨符進行區分
*/
class Base{
public:
int a,b;
static int c;
void print(){
cout<<"a:"<<a<<"b:"<<b<<endl;
}
};
class Derived:public Base{
public:
int b,c;
void print(){
cout<<"c:"<<c<<"b:"<<b<<endl;
}
void printStatic(){
cout<<"static C:"<<Base::c<<endl;
}
};
/**
* 靜態成員初始化
靜態成員屬于類作用域,但不屬于類對象,和普通的static變量一樣,程序一運行就分配內存并初始化,生命周期和程序一致。
所以,在類的構造函數里初始化static變量顯然是不合理的。
靜態成員其實和全局變量地位是一樣的,只不過編譯器把它的使用限制在類作用域內(不是類對象,它不屬于類對象成員),要在類的定義外(不是類作用域外)初始化。
*/
int Base::c = 10;// 這種事標準寫法
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
//第一步,看調用的是否在類內部, 這里在main函數中,使用對象訪問.
//第二步,看子類 對 父類的繼承,是 public ,protected,還是private
//第三步,看父類的方法,屬性的訪問控制權限.
A a = A();
B b = B();
b.printB();
C c = C();
c.printB();
/**
* 測試 子類與父類的同名變量的調用
*/
Derived d;
d.a = 1;
d.Base::b = 2;
d.b = 3;
d.c = 4;
Base::c = 20;
d.Base::print();
d.print();
d.printStatic();
return 0;
}