2015-01-09 129 views
0

我對於面向對象的程序來說相當陌生,所以也許這是一個基本問題,但我會很感激您可以提供的任何幫助。繼承和調用成員函數

如果我有一個從類A派生的類B,有什麼方法可以讓類B的對象從類A的成員函數中訪問類B的成員函數?所以在下面的例子中,如果最初調用function1的對象是B類型的,我可能會從function1中調用function2。這是否可能,如果是這樣,我該如何實現它?謝謝!

class A 
    { 
    public: 
     int a; 
     int b; 
     A(){} 
     A(int a, int b) { this->a = a; this->b = b; } 
     int function1();// { call function2 if class B } 
    }; 
    class B : public A 
    { 
    public: 
     int c; 
     int d; 
     B(){} 
     B(int c, int d) { this->c = c; this->d = d; } 
     int function2(); 
    }; 

回答

1

是的。您需要在A類中將function2()定義爲虛擬功能。然後,如果對象實際上是B,則從function1調用它將導致調用B的function2()。例如:

class A 
    { 
    public: 
     int a; 
     int b; 
     A(){} 
     A(int a, int b) { this->a = a; this->b = b; } 
     int function1() { return this->function2(); } 
     virtual int function2() { return 0; } 
    }; 
    class B : public A 
    { 
    public: 
     int c; 
     int d; 
     B(){} 
     B(int c, int d) { this->c = c; this->d = d; } 
     int function2() override { return 999; } 
    }; 

如果沒有爲A明智實施function2,那麼它將永遠是有意義的有一個A對象。你可以通過聲明function2爲純虛擬表達方式;例如

virtual int function2() = 0; 
4

A一個功能不具有哪些方法有一個事實,即延伸AB存在,並且想法。

爲了能夠調用B中從A實現的特定方法,您需要在A中聲明它爲virtual,可能是純虛擬的(= 0)。

class A { 
    protected: 
    virtual void function2() = 0; 

    public: 
    void function1() { this->function2(); } 
} 

class B : public A { 
    protected: 
    void function2() override { ... } 
} 

virtual方法在運行時被解決,這意味着,當被調用時,執行在其上調用該對象的更具體的實現。純粹的virtual方法沒有任何基礎實現,這使得A抽象並禁止其實例化。

編輯:最後說明,不要從基礎構造函數或析構函數調用virtual方法。這是危險的和不好的做法,不是這是你的情況,但你永遠不知道。

0

virtual允許您在父類中重寫函數。

class A 
{ 
public: 
    A(){} 
    A(int a, int b):a(a), b(b) {} 
    int function1() { return this->function2(); } 
    virtual int function2() { //what function2 in parent class should do } 
private: 
    int a; 
    int b; 
}; 
class B : public A 
{ 
public: 
    B(){} 
    B(int c, int d):c(c), d(d) {} 
    int function2() { //what function2 in child class should do } 
private: 
    int c; 
    int d; 
};