使父类成员对每个派生类都不可修改

时间:2017-01-03 19:16:13

标签: c++ c++11 inheritance constructor

我想知道如何为每个派生类制作不可修改的父类成员。

我的代码现在正确地赋予它的值(取决于调用父类'构造函数的Child类),但m_type可以很容易地修改(例如在myfunction中)和那个& #39; s我想避免的事情。

#include <iostream>

enum Piece_type{    king=1,     queen=3,    rook=3,     bishop=4,   knight=5,   pawn=6};

class Piece
{
    protected:
        Piece_type  m_type; // static Piece_type m_type; <- doesn't work

        Piece(Piece_type ex): m_type(ex) {}
};

class Pawn: public Piece
{
public:
    Pawn():Piece(pawn) {}   // To initialise m_type as pawn for all my Pawn objects

    void myfunction()
    {
        std::cout<<"My piece type is "<< m_type<<std::endl;;
        m_type= knight;   // This is the assignation I want to avoid happening
        std::cout<<"My new piece type i "<<m_type<<std::endl;
    }    
};

我的问题与this one有关,但继承似乎无法声明静态变量并通过成员初始化程序定义其值。

我已经找到了如何从this question中的Child类调用父/基类构造函数。

提前致谢,

爱德华

修改

我稍微对其进行了修改,以免混淆任何人,因为const确实可以解决我说过的问题。

2 个答案:

答案 0 :(得分:3)

嗯,你没有陷入通常的错误,即在没有成员初始化列表的情况下尝试使用CREATE MEMBER CURRENTCUBE.[Timeframe].[Timeframe].[ROLLING 3 MONTH] AS IIF([Accounting Date].[Accounting Date].CurrentMember.Level.Name="Month", AGGREGATE(LASTPERIODS(3),[Timeframe].[Timeframe].&[1]), NULL), VISIBLE = 1; 成员变量,所以const就是你真正需要的:

const

答案 1 :(得分:3)

他们只有阻止派生类型修改父级成员的方法是使这些成员成为privateconst。由于您无法成为成员const,因此唯一的另一种方式是声明成员private并添加protected访问者方法,例如:

Piece_type get_type() const 
{
    return m_type;
}

这样,派生类可以调用get_type()来了解m_type的值,但不能直接访问它,阻止它们写入它。