通用继承将超级数据字段更改为const [来自HW]

时间:2014-01-06 15:35:55

标签: c++

假设我有一个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?

3 个答案:

答案 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
}