【发布时间】:2014-09-23 16:22:46
【问题描述】:
我有一个抽象基类和一对从这个基类派生的类。我想介绍一个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 吗?如果这不是你的意思,你能改写成一个具体的问题吗?
-
它不需要修改,对于给定派生类的每个实例都是相同的值。但对于每个不同的派生类,它是不同的值。
-
这听起来像是 X/Y 问题。你能告诉我们你为什么需要这个吗?
-
如果每个派生类需要不同的值,则需要在内存中使用不同的位置,因此不能是静态的。您可以将其设为模板类并为每个派生具有不同的值,但它们实际上不会是相同的基类。 Mike 的答案尽可能接近,如果您不想存储它,可以使用具有常量返回类型的虚拟调度,或者您需要将该变量存储在特定于实例的变量中。
标签: c++ inheritance static constants