2010-11-06 95 views
3

這是我的問題。我想有這樣的事情:正在初始化一個抽象類?

class A { 
protected: 
int someInt; 
virtual void someFunc() = 0; 

}; 

class B : public A { 
protected: 
virtual void someFunc() { // uses someInt} 
public: 
B() {//tell the A inside of B to set someInt to whatever it wants} 
}; 

所以基本上,someInt是可以改變的,它不是恆定的,但我想實現一個使用由一種someInt提供一個值的所有類。

感謝

+0

你的問題有點模糊,你說'A'提供的價值是什麼意思? – user472875 2010-11-06 15:55:31

+0

我的意思是,作爲抽象類開發人員,我給出了一個默認值,以便從A繼承的任何人都繼承了我希望A具有的值 – jmasterx 2010-11-06 16:04:22

回答

4

您可以使用初始化列表在構造函數中調用父構造函數:

class A { 
protected: 
    int someInt; 
    virtual void someFunc() = 0; 
    A(int x) : someInt(x) {} // Base-class constructor (initialises someInt) 
}; 

class B : public A { 
protected: 
    virtual void someFunc() {} 
public: 
    B() : A(10) {} // Initialises base class via constructor 
}; 
0

我不知道你想要什麼,但如果你在A構造函數初始化someInt,子類將看到價值。

class A { 
public: 
    A() : someInt(5) {} 
protected: 
int someInt; 
virtual void someFunc() = 0; 

}; 

class B : public A { 
protected: 
virtual void someFunc() { // uses someInt} 
public: 
B() {// at this point someInt will already have been initialized to 5} 
}; 

當構造子類時,首先執行基類構造函數。

1

這是你想要的嗎?

class A 
{ 
protected: 
    int someInt; 

public: 
    A(int _val) : someInt(_val) 
    { 
    }; // eo ctor 
}; // eo class A 


class B : public A 
{ 
public: 
    B() : A(5) // initialise someInt with 5 
    { 
    }; // eo ctor 
}; // eo class B 

注意,作爲「someInt」是受保護的,你可以將其設置在B的構造反正。

B() 
    { 
     A::someInt = 5; 
    }; // eo ctor 
0
class A { 
protected: 
    int someInt; 
    virtual void someFunc() = 0; 
    A(){//set someInt here} 
}; 

class B : public A { 
protected: 
    virtual void someFunc() { // uses someInt} 
public: 
    B():A() {} 
}; 

受保護的構造函數將實現這一目標。如上。使用公共構造函數的解決方案也很好,但由於不能直接在thr接口上調用構造函數,所以我認爲protected更好。