有這麼三個類函數
class IA { public: virtual void func1() = 0; virtual void func2() = 0; }; class B : public IA { public: B(); virtual void func1(); virtual void func2(); void func3(); static void func4(); protected: void printMember(); protected: int m_protected; private: int m_private; }; class C : public B { public: C(); virtual void func1(); void func3(); private: void printMember(); private: int m_private; };
A是抽象類,B是基類,C是派生類spa
實現代碼:指針
B::B():m_protected(1),m_private(2) { printf("B constructor\n"); } void B::func1() { printf("B::func1\n"); } void B::func2() { printf("B::func2 \n"); } void B::func3() { printf("B::func3\n"); printMember(); } void B::func4() { printf("B::func4\n"); } void B::printMember() { printf("B m_protected:%d\n", m_protected); printf("B m_private:%d\n", m_private); } C::C():m_private(3) { printf("C constructor\n"); } void C::func1() { printf("C::func1\n"); } void C::func3() { printf("C::func3\n"); printMember(); } void C::printMember() { printf("C m_protected:%d\n", m_protected); printf("C m_private:%d\n", m_private); }
問題:基類和派生類的繼承關係code
三種不一樣方式繼承的基類和派生類繼承關係對象
public | protected | private | |
共有繼承 | public | protected | 不可見 |
私有繼承 | private | private | 不可見 |
保護繼承 | protected | protected | 不可見 |
考慮如下函數:繼承
C *c = new C(); c->func1(); // #2 派生類重寫基類func1函數 c->func2(); // #3 繼承基類函數 c->func3(); // #4 基類派生類同名函數 C::func4(); // #5 繼承基類函數 delete c;
函數輸出:ci
B constructor C constructor C::func1 B::func2 C::func3 C m_protected:1 C m_private:3 B::func4
派生類C繼承基類的公共成員函數func2,靜態成員函數func4,成員變量m_protected。table
私有成員函數和私有成員變量不繼承。class
同名(同參數)函數不繼承。變量
問題:基類指針指向派生類對象
考慮如下函數
B *b = new C(); b->func1(); // #2 派生類重寫基類虛函數,此時指向派生類的函數實現 b->func2(); // #3 派生類沒有重寫基類虛函數,此時指向基類的函數實現 b->func3(); // #4 基類和派生類同名函數,調用的是基類的函數。 B::func4(); delete b;
函數輸出:
B constructor C constructor C::func1 B::func2 B::func3 B m_protected:1 B m_private:2 B::func4