2016-06-24 53 views
1

我們不能創建抽象類的對象,對吧?那麼我怎樣才能調用一個在抽象基類和派生類中定義的虛函數呢?我想執行抽象基類中的代碼,但目前我正在使用派生類的對象。如何在C++中的抽象基類和派生類中定義基類的虛函數定義?

class T 
{ 
    public: 
    virtual int f1()=0; 
    virtual int f2() { a = 5; return a } 
} 
class DT : public T 
{ 
    public: 
    int f1() { return 10; } 
    int f2() { return 4; } 
} 

int main() 
{ 
    T *t; 
    t = new DT(); 
    ............ 
} 

有什麼辦法可以使用對象t調用基類函數嗎?如果不可能,我需要做些什麼才能調用基類函數?

+1

如何創建一個最小的,完整的,並且可驗證例如http://stackoverflow.com/幫助/ mcve –

+0

@RichardCritten一般來說很有用,但要公平起見,OP對代碼的描述足以理解。 – Angew

回答

4

就像你會調用任何其它基類實現:使用明確的資格繞過動態調度機制。

struct AbstractBase 
{ 
    virtual void abstract() = 0; 

    virtual bool concrete() { return false; } 
}; 

struct Derived : AbstractBase 
{ 
    void abstract() override {} 

    bool concrete() override { return true; } 
}; 

int main() 
{ 
    // Use through object: 
    Derived d; 
    bool b = d.AbstractBase::concrete(); 
    assert(!b); 

    // Use through pointer: 
    AbstractBase *a = new Derived(); 
    b = a->AbstractBase::concrete(); 
    assert(!b); 
} 
+0

請檢查添加的代碼。 – aaroh

+2

@aaroh這甚至沒有編譯。也許它應該是'T * t;'?如果是這樣,只要't-> T :: f2()';並編輯您的問題以獲得正確的代碼。 – Angew

1

您可以調用函數時明確指定類範圍:

class A { /* Abstract class */ }; 
    class B : public A {} 

    B b; 
    b.A::foo(); 
1

如果抽象基類有一些代碼,然後只需調用BaseClassName :: AbstractFunction()

class Base 
{ 
    virtual void Function() {} 
} 

class Derived : Base 
{ 
    virtual void Function() { Base::Function(); } 
} 
相關問題