?? staticvirtualinherittest.cpp
字號:
// 這是使用應用程序向導生成的 VC++
// 應用程序項目的主項目文件。
#include <stdafx.h>
#include <iostream.h>
#include <typeinfo.h>
#include <new>
#using <mscorlib.dll>
#include <tchar.h>
#include "son.h"
using namespace System;
char * GetMemory(int num)
{ //返回局部申請的動態空間,可行,
char *p=NULL;
p=new char[num];
return p;
}
int _tmain(void)
{
char *str=NULL;
str = GetMemory(15);
strcpy(str,"hello");
cout<<str<<endl;
delete str;//記得delete
Son son;
Son * pRef=&son;
Father *p1=dynamic_cast<Father *>(pRef);
try
{
//Son *p3 = static_cast<Son *>(p2);
p1->GetName(); //多態!
const char * str = typeid(Son).name();
cout<<str<<endl;//
}
catch(std::bad_exception&)
{
cout<<"cast error:";
}
cout<<p1->GetA()<<endl; //cout 8,數據成員沒有多態 ,所以即使p1是指向兒對象的父類指針,
//但Father::GetA()中的m_a是son.Father::m_a,為8,而不是100
cout<<son.m_a<<endl;//100
son.SetA(66,88);
Son s1;
s1=son;//調用=函數,如果函數中沒寫,則會使得s1與son的父類成員值不同!!!
cout<<"son.Father::m_a and son.m_a is:"<<son.Father::GetA()<<" "<<son.m_a<<endl;
cout<<"s1.Father::m_a and s1.m_a is:"<<s1.Father::GetA()<<" "<<s1.m_a<<endl;//,如果函數中沒寫=函數,(輸出8,88)
Son s2=s1;//調用拷貝構造函數,如果函數中的冒號后沒寫Father(son)
//則強行調Father(),會使得s2與s1得父類成員值不同!!!
cout<<"s2.Father::m_a is:"<<s2.Father::GetA()<<"and s1.Father::m_a is:"<<s2.Father::GetA()<<endl;//66,66
cout<<s2.m_a<<endl; //cout 88
//測試隱藏func():子類寫了一個void func(float count),將父類的所有的func()隱藏!!
// s2.func("gao");//報錯:error C2664: “Son::func” : 不能將參數 1 從“char [4]”轉換為“float”
//原因即: 由于子類隱藏了父類的func(char *p)函數,則子類沒有了void func(char *p)!!
s2.func(5); //由于子類隱藏了父類的func(int count)函數,則子類沒有了void func(int count),
//只會將5轉為5.0f,調用自己的func(float count);所以cout father func(int count)
//并不是子類沒有或著沒辦法調func(char *p),其實子類有這個函數,用下面的寫法
s2.Father::func("gao");//即隱藏的函數當然要顯示調用,否則叫什么隱藏?
Father &fp1=s2;
fp1.func(5.6);//截斷5.6為5 ,調用father::func(int count)!,
//總之,不具備多態時,"想"父類的數據成員或函數時,要顯示調用!自己沒有那樣的函數時,報錯!
//測試”間接多態“,即轉到父類成員函數中,又在函數中碰到virtual 函數!
fp1.test1();//間接多態,調用了Father::test1(),進入后,碰到的GetName()是virtual
//則實際是this->GetName(),this是fp1的對象s2的地址,當然多態!注意引用也可多態!
Father *fp2=&son;
fp2->test2(fp1); //間接多態,調用了Father::test1(),進入后,碰到的GetName()是virtual
//則實際是fp1.GetName(),當然多態!
Father fa;
Father *f[2]={&fa,&son};//對象的指針數組,每個成員都是父類型的指針!
for(int i=0;i<2;i++)
{
f[i]->GetName();
}
//cout<<"the f[1]->m_a is:"<<f[1]->m_a;//如果m_a在Father類中是public,正確,注意:實際是son對象的Father::m_a
//所以提示:error C2248: “Father::m_a” : 無法訪問 private 成員(在“Father”類中聲明)
//很明顯,子類的隱藏m_a是public型的,但報錯,說明f[1]的權限只能調父類型的成員及函數
//父類型的指針只能調用父類型的成員及函數,但有一個特例--virtual 覆蓋函數!
//所以在外面如何想訪問子對象的象m_a這樣隱藏的成員及
//象func(float count)這樣隱藏的成員函數;用父類型的指針無法做到!!!!!!!
cout<<"the f[1]->m_b is:"<<f[1]->m_b;//實際是son對象的Father::m_b沒有隱藏
// cout<<"the f[1]->m_d is:"<<f[1]->m_d;//錯誤!內存截斷,沒有隱藏更是沒法訪問!
//提示:error C2039: “m_d” : 不是“Father”的成員
char *q="hao";
int q1=(int)q;
cout<<" the q1'address is "<<q1<<endl;
*(q+1)='m';
cout<<q<<q1<<endl;//q 為hmo
int j=9;
cin>>j;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -