假设我有一个A类,我想编写一个继承自A类的B类。
A类代码:
template<class S, class T>
class A {
protected:
S data1;
T data2;
public:
...
};
B类代码:
template<class S, class T>
class B: public A {
protected:
B<S, T>* next;
public:
...
}
如何从A继承data1字段但在B中使它成为const?
答案 0 :(得分:1)
您的示例甚至不会按原样编译(缺少A
的模板参数),修复它也提供了解决问题的提示。这是这样做的一种方式(假设我已正确理解你的问题):
template<class S, class T>
class B: public A<const S, T> {
protected:
B<S, T>* next;
public:
...
}
答案 1 :(得分:0)
我会选择private
成员:
template<class S, class T>
class A {
private:
S data1;
protected: // Or private with accessor
T data2;
public:
...
};
template<class S, class T>
class B: public A<S, T> {
protected:
B<S, T>* next;
public:
...
};
因此,您无法修改data1
中的B
。
答案 2 :(得分:0)
你不能也不应该。如果成员在B
而不是A
中具有不同的cv限定符,则可能会导致严重问题。
例如:
void A::foo()
{
//do something to data1
}
void B::bar()
{
if (//data1 invariant)
foo(); // invariant changed
if (//data1 invariant)
//due to const propagation we enter here, but the invariant isn't kept
}