2014-10-11 75 views
0

我想傳遞一個指向從抽象基類繼承的類的指針,但在以下(非常簡化)代碼中調用函數f()時發生EXC_BAD_ACCESS錯誤傳遞對繼承自抽象基類的類的引用

class A { 
    double *pointer; 
public: 
    A(double *p) 
    { 
     pointer = p; 
    }; 
    virtual void f() = 0; 
}; 

class B :public A{ 
    double *pointer; 
public: 
    B(double *p_) : A(p_){}; 
    void f(){std::cout << pointer[0] << std::endl;}; 
}; 

如果我稱之爲eg這樣

double p[2] = {1.,2.}; 
B b(p); 
b.f(); 

的問題似乎並不在那裏,如果基類不是抽象的,但我想不出有什麼錯上面的代碼。任何幫助解決這個問題,並可能提出一種不同的方式來實現這種結構,非常感謝!

+0

在類「B」中,聲明一個名爲'pointer'的* new *數據成員。因此,「B」類型的對象有兩個*數據成員,稱爲'pointer':一個來自A類,另一個來自'B'類。 – dyp 2014-10-11 23:58:12

回答

3

問題是f()中的「pointer [0]」最終訪問B類的pointer成員,而不是A超類的pointer成員。

而且由於它沒有初始化,在你的例子中,它是未定義的行爲。

只需在B中刪除pointer的聲明即可。

+0

謝謝,它的工作原理,我只需要在A保護指針的聲明。 – jacob 2014-10-12 00:06:59