-
基類成員訪問屬性? 繼承方式? 派生類成員訪問屬性
private成員? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?無法訪問
protect成員? ? ? ? ? ? public? ? ? ? ? protected
public成員? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public
查看全部 -
void test1(Person p){p.play}調用test1的時候,因為在test1中所定義的參數是一個對象P,所以傳值的時候會先實例化臨時對象P,通過臨時對象P調用play這個函數,在test1執行完畢之后,p這個臨時對象就會被銷毀 如果函數的參數是基類的對象,那么基類的對象和派生類的對象,都可以作為實參傳遞進去,并且可以正常使用。 void test2(Person &p) ?沒有實例化臨時對象,使用基類的引用也可以接收基類的對象以及派生類的對象 void test3(Person *p)的調用結果和void test2(Person &p)一樣 因為不產生臨時變量,所以void test3(Person *p)、void test2(Person &p)效率更高
查看全部 -
<table><tbody><tr class="firstRow"><td><code>Person *p=</code><code>new</code> <code>Soldier;</code><code>//用父類Person的指針指向堆中分配的子類Soldier的對象</code><code>delete</code> <code>p;</code><code>p=NULL;</code><code>//只執行父類的析構函數,而不執行子類的析構函數,可能導致內存泄露</code></td></tr></tbody></table><p>【如何在這種情況下防止內存泄露?】</p><p>虛析構函數:當存在繼承關系,且要用一個父類的指針指向堆中子類的對象,并希望用父類的指針釋放這塊內存時,可以使用。</p><table ><tbody><tr class="firstRow"><td>12345</td><td><code>class</code> <code>Person{</code><code> </code><code>Person();</code><code> </code><code>virtual</code><code>~Person(); </code><code>//前面加關鍵字virtual即可,這個關鍵字可以被繼承下去</code><code>}</code><code>//在Soldier.h中,即使在~Soldier前面不寫virtual,也相當于有了這個關鍵字(被繼承下來了)</code></td></tr></tbody></table><p><br/></p>查看全部
-
父類的指針指向子類對象的時候 ?只能訪問子類中父類原有的成員,而無法訪問子類中獨有的數據成員和成員函數 子類對象向父類對象賦值。或用子類對象初始化父類對象,本質是將子類當中從父類繼承下來的數據成員賦值給父類對象,而其他的數據將會被截斷,丟失。 父類指針指向子類對象。父類指針只能訪問父類原有的成員。
查看全部 -
子類和父類的重名函數無法形成重載,只能進行隱藏
查看全部 -
遇到一個小問題,在使用#include<string>時,需要配套使用using namespace std;才可正常使用string,否則會出錯,也就是string類型應該是在std命名空間。以前一直僅把他當作#include<iostream>使用cout時的命名空間,現在想來應該是同名的命名空間。public Soldier : public Person<br> {<br> }<br> 注意只有一個':',不是兩個. 使用string類型必須包含<string> 聲明類的最后要加分號. undefined reference問題:一般是少了目標文件 g++ 編譯時要加入所有相關的.o文件 include包含頭文件時注意雙引號“”和尖括號<>是不同的,編譯器會搜索不同的路徑 (1)尖括號<>是引用C++自身文件庫里的頭文件,如<iostream> (2)雙引號“”則是引用用戶自己編寫的頭文件,如“Person.h”
查看全部 -
A類有void ABC(),B類也有void ABC(),B類公有繼承A類,基類中的ABC()成員函數就會被B類中的ABC()成員函數隱藏,隱藏的特性體現在:當實例化B的對象的時候,使用該對象只能夠直接的訪問到子類B中的ABC()成員函數,而無法訪問父類中的ABC()成員函數 從語法的角度來說,同名的數據成員也具有隱藏的特征<br> 父子關系,成員同名,隱藏 對象調用同名的成員函數:直接soldier.play();調用的是自己的成員函數,如果要調用父類的成員函數,則需要加上父類的類名,soldier.Person::play()
查看全部 -
公有繼承 class A:public B 保護繼承 class A:protected B 私有繼承 class A:private B 公有繼承時基類中各成員屬性保持不變,基類中private成員被隱藏。 派生類的成員只能訪問基類中的public/protected成員,不能訪問private成員; 派生類的對象只能訪問基類中的public成員。 保護繼承時基類中各成員屬性均變為protected,且基類中private成員被隱藏。派生類的成員只能訪問基類中的public/protected成員,不能訪問private成員;派生類的對象不能訪問基類中的任何的成員。 私有繼承時基類中各成員屬性均變為private,且基類中private成員被隱藏。派生類的成員也只能訪問基類中的public/protected成員,不能訪問private成員 派生類的對象不能訪問基類中的任何的成員。
查看全部 -
①通過public繼承的都是被繼承為派生類中所對應的訪問屬性(private例外),
如:基類public通過public繼承為派生類中public;
????? ?基類protected通過public繼承為派生類中protected‘
????? ?基類private通過public繼承為無法訪問。
②通過protected繼承的都是被繼承為派生類中的protected訪問屬性(private例外),
如:基類public通過通過protected繼承為派生類中protected;
???????基類protected通過protected繼承為派生類中protected;
????? ?基類private通過protected繼承為無法訪問。
③通過private繼承的都是被繼承為派生類中的protected訪問屬性(private例外),
如:基類public通過通過private繼承為派生類中private;
???????基類protected通過private繼承為派生類中private;
????? ?基類private通過private繼承為無法訪問。
查看全部 -
公有成員可以直接訪問,可以間接通過自身類的公有函數訪問,也可以通過子類的公有函數訪問?
保護成員不可以直接訪問,可以間接通過自身類的公有函數訪問,也可以通過子類的公有函數訪問?
私有成員不可以直接訪問,可以間接通過自身類的公有函數訪問,不可以通過子類的公有函數訪問
private不能繼承、類外不能訪問,protected能繼承,類外不能訪問,public能繼承、類外能訪問??偨Y:權限:類外訪問 < 繼承 < 類內訪問。
查看全部 -
基類成員訪問屬性? 繼承方式? 派生類成員訪問屬性
private成員? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?無法訪問
protect成員? ? ? ? ? ? public? ? ? ? ? protected
public成員? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public
查看全部 -
//聲明2個類
class
?Person
{
????
public
:
????????
Person();
????????
~Person();
????????
void
?eat();
????????
string?m_strName;
????????
int
?m_iAge;
?};
class
?Worker:?
public
?Person
{
????
public
:
????????
Worker();
????????
~Worker();
????????
void
?work();
????????
int
?m_iSalary;
};
//定義2個類
Person::Person()
?
{
?????
cout<<
"Person()"
<<endl;
?
}
Person::~Person()
??
{
??????
cout<<
"~Person()"
<<endl;???
??
}
void
?eat()
{
????
cout<<
"eat()"
<<endl;
}
?????
??
//定義worker類的函數
?
Worker::Worker()
?
{
?????
cout<<
"Worker()"
<<endl;
?
}
?
???
Worker::~Worker()
??
{
???
cout<<
"~Worker()"
<<endl;
??
???
}
??
void
?work()
??
{
???
cout<<
"work()"
<<endl;
??
}?
??
//應用
??
Worker?*p?=?
new
?Worker();
??
p->m_strName?=?
"jim"
;
??
p->m_iAge?=?10;
??
p->eat();
??
p->m_iSalary?=100;
??
p->work();
??
delete
?p;
??
p?=?NULL;
??
//先調用Person,再Worker,析構相反
查看全部 -
什么是繼承,為什么要繼承?
基類----派生類
父類 ----子類
class worker : public person
{
public:
????void work();
????int m_iSalary;
}
//工人類繼承了人類,就不需要重新寫人類的屬性,只寫自己的屬性;工人類是人類的派生類,人類是工人類的基類;人類是父類,工人是子類。
所以派生類和基類是一起組合,父類和子類是一起組合
查看全部 -
多重繼承:比如,人類-士兵類-步兵類,
class Person{};
class Soldier:public Person {};
class Infantryman:public Soldier{};
多繼承:一個子類,同時有2個父類,或者一個派生類,有2個基類,這此種情況為多繼承。
class Worker{};
class Farmer{};
class MigrantWOrker:public Worker, public Farmer{};
查看全部 -
父類和子類有同名的成員函數,但有不同的參數,此種情況也形成隱藏
查看全部
舉報