2012-03-05 35 views
2

有沒有一種方法可以在派生類的基類中調用成員函數?C++派生函數與基函數的比較

Class Bass{ 
    public: 
     void func(); 
}; 

Class Derived: public Base{ 
    public: 
     void func(); 
}; 

我有一個練習期中,我懷疑沒有,因爲基類如何知道派生,但我不知道。

+0

你說的是虛函數?這就是他們的工作方式。您可以在基類中定義一個虛函數,在dervied類中實現它,並且可以從基類中調用它。這通常用作[TemplateMethod](http://en.wikipedia.org/wiki/Template_method_pattern),以允許所述基類定義的一個過程步驟的順序但派生類定義這些步驟是如何實現的。 –

回答

2

有沒有什麼建議可以在從它派生的類中調用基類的成員函數的方法嗎?

不知道你的意思到底是什麼,但鑑於你BaseDerived類,你可以做到以下幾點。由於slicing problem,請確保您使用引用或指針,而不是傳值。


呼叫Base::func()Derived::func()內:

void Derived::func() 
{ 
    Base::func(); 
} 

呼叫Base::func()明確一個Derived對象:

Derived d; 
d.Base::func(); 

我[...]我想知道如果正如其他人所指出的,你可以不喜歡Base::func(Derived d)

,您可以在此使用前向聲明做:

// Tell the compiler "Derived" is a class name. 
class Derived; 

class Base 
{ 
    // Can use the class name since it has been declared. 
    void func(Derived& derived); 
}; 

// Define the class named "Derived". 
class Derived : public Base 
{ 
    // ... 
}; 

// Use the derived class. 
void Base::func(Derived& derived) 
{ 
    // For this bit to work, the definition of `Derived` must 
    // be visible at this point (like putting the class above 
    // or including your "Derived.h" from "Base.cpp"). 
    derived.some_derived_method(); 
} 

但是,您將無法定義Base::func(Derived&)直接在類定義中,因爲您需要完成定義Base並首先定義Derived

+1

謝謝你,這就是我的意思 – Zack

+0

@Zack:哪一部分? –

+0

我也能猜到一箇中期問題將參照虛函數(所以調用在「基地和」虛方法實際上所說的「派生」執行)。 – bdow

0

你應該能夠做這樣的事情:

class Derived; 

class Base { 
    public: 
     void func(); 
     void func(Derived); 
}; 

class Derived : public Base { 
    public: 
     void func(); 
}; 

void 
Base::func(Derived D) { 
} 

這是好於基本的成員函數聲明使用不完全類型,但是你必須提供自己的定義之前,完整的類型。

+1

應該在這種情況下,通過逐指針或引用 – KillianDS

+0

@KillianDS - 他沒有要求對於傳指針或傳址引用。他的問題要求傳遞價值。爲什麼反對?你是否暗示我的代碼片斷是無效的? –

+1

是的,它是無效的。請參閱[此代碼示例](http://ideone.com/X04d3)。編譯器在向前聲明進行復制時不太瞭解「派生」,這對於傳值是必需的。 [通過引用傳遞](http://ideone.com/xfb2p)可以工作,因爲它不需要所有類型的信息。 – KillianDS

1

如果我理解正確,你需要調用派生參數的基函數? 只能使用前向聲明並通過指針或ref傳遞派生對象。

class Derived; 
class Base{ 
    public: 
     void func(Derived&); 
}; 
+1

這解決的問題非常好,所以爲什麼downvote –

-1

首先,你是指一個對象或靜態類方法的方法嗎?

其次,答案是:它取決於你調用方法調用的對象是什麼。這是多態性的本質:如果你的對象是'Derived'類型的,那麼即使它已經被轉換爲'Base',方法調用仍然會調用Derived版本的func。

那是你在問什麼?

+0

其實,這只是適用於虛函數的真正 – bdow

0

您可以使用前置聲明派生類:

class Derived;