基類和派生類

有這麼三個類函數

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