繼承方式
如果不指定public,C++默認的繼承是私有繼承..
1.公有繼承:派生類的對象可以訪問基類中的公有成員凰浮,派生類的成員函數(shù)可以訪問基類中的公有成員和保護成員
2.私有繼承:派生類的對象對基類的所有成員都是不可見的,派生類的成員函數(shù)可以訪問基類中的公有成員和保護成員
class Animal
{
public:Animal()
void eat() {cout<<"eat"<<endl}
};
class Giraffe:private Animal
{ public:
Giraffe(){}
void take(){ eat(); }//ok
};
void main()
{
Giraffe gir;
gir.eat();//error
gir.take();//ok
}
3.保護繼承:基類的public和protected成員都作為派生類的protected成員袜茧,保護繼承不可修改父類的公有變量菜拓。
指針類型轉換區(qū)別
1.這里的pa是本來就指向類A的對象,這里轉換成B* 意思只是把pa轉成了B類型笛厦,但是仍然指向的是A的對象纳鼎,所以pb其實還是指向了A
class A {
public:
void virtual f() { cout<<"A"<<endl; }
};
class B : public A{
public:
void virtual f() { cout<<"B"<<endl; }
};
int main()
{
A* pa = new A();
pa->f();
B* pb = (B* )pa;
pb->f();
}
2.這里pb實際上指向的是C類對象的B類部分,在進行pc=(C*)pb之后指向了同一個位置
class A{};
class B{};
class C: public A, public B{};
void main()
{
C* pc = new C;
B* pb = dynamic_cast<B*>(pc);
A* pa = dynamic_cast<A*>(pc);
}
虛函數(shù)繼承和虛繼承
1.虛繼承 class B: public virtual A递递,輸出sizeof(A)是4喷橙,sizeof(B)是12,因為虛繼承時B需要維護一個指向A的虛類指針指向A(4字節(jié))登舞,需要一個B類的虛表指針(4字節(jié))贰逾,外加A的字節(jié)數(shù)(4字節(jié))..
2.如果是普通的繼承關系,如下菠秒。輸出sizeof(A)是4疙剑,sizeof(B)是4..
#include <iostream>
#include <memory.h>
#include <assert.h>
#include <math.h>
using namespace std;
class A
{
virtual void func();
};
class B: public A
{
virtual void foo();
};
int main()
{
std::cout<<sizeof(A)<<std::endl;
std::cout<<sizeof(B)<<std::endl;
system("pause");
return 0;
}
2.虛繼承:多重繼承中特有的概念。虛擬基類是為了解決多重繼承而出現(xiàn)的~~~
class JetPlane: public Rocket, public Airplane
3.純虛函數(shù):可以構造一個抽象類践叠,這個類不能實例化成一個對象言缤。