我有一個抽象基類和從這個基類派生的一對類。我想介紹一個static const
成員,它在兩個派生類之間具有不同的值,但對於給定的派生類的所有實例具有相同的值。聲明抽象基類中的靜態常量成員,將它賦值給派生類中的值?
我有代碼使用分配給兩個派生類之一的實例的基類指針,這樣我就可以通過更改指派給基類指針的派生類之間輕鬆切換。我希望能夠以類似的方式使用基類獲取派生類的常量值的值,以便我可以輕鬆地在兩個類之間切換。期望的行爲看起來是這樣的:
#include <iostream>
using namespace std;
// Abstract base class
class A {
protected:
int c; // this is really a constant and should also be static
public:
static int s;
int get_c() const {
return this->c;
}
virtual int foo() = 0; // makes this class abstract
};
class B : public A {
public:
static const int sb = 10;
B() {
this->c = 1;
}
int foo() {
return -1;
}
};
class C : public A {
public:
static const int sc = 20;
C() {
this->c = 2;
}
int foo() {
return -2;
}
};
int main() {
B btest;
C ctest;
A *ptr = &btest; // pointer to instance of B
//cout << ptr->c << endl; // would fail compilation (c is protected)
cout << "B's c = " << ptr->get_c() << endl;
cout << "B's foo() returns " << ptr->foo() << endl;
cout << "Accessing B's static const member: " << B::sb << endl;
ptr = &ctest; // pointer to instance of C
//cout << ptr->c << endl; // would fail compilation (c is protected)
cout << "C's c = " << ptr->get_c() << endl;
cout << "C's foo() returns " << ptr->foo() << endl;
cout << "Accessing C's static const member: " << C::sc << endl;
return 0;
}
在上面的代碼sb
和sc
是static const
會員我想要的,但他們的問題是基類A
沒有他們的知識。基類成員c
正在做我想要的,但不是static const
根據需要(我做了c
一個protected
成員,以便它不能被修改,但如果我可以宣佈它const
那麼它可以是public
)。此代碼具有從c
所需的行爲:
- 我可以得到鮮明的值
c
從使用基類指針每個派生類。 c
是有效的,因爲它是protected
,我沒有提供setter功能。
然而,c
是不是真的不斷在它不是const
,它不是那麼static
每個實例有它的一個不必要的副本。
有沒有辦法得到想要的行爲,還宣佈c
與static const
像sb
和sc
?
我不明白這個問題,如果你想爲每個派生c一個不同的值,那麼它不能是靜態的。如果需要修改,那麼它不能是const。如果關注只是訪問,那麼你可以在基類中將其隱藏起來,並在必要時提供公共getter/setter?如果這不是你的意思,你能否改寫成具體的問題? – skimon 2014-09-23 16:36:58
它不需要修改,並且對於給定的派生類的每個實例它都是相同的值。但對於每個不同的派生類來說它是一個不同的值。 – Null 2014-09-23 16:39:58
這聽起來像是一個X/Y問題。你能告訴我們爲什麼你需要這個嗎? – Borgleader 2014-09-23 16:40:33