class B常にオブジェクト*aとして機能する場合constは、他の人が言っているように、宣言を次のように変更するだけです。
public: const A* a
この時点で、 の constness は、 の constness とB::Func2はまったく関係がないため、ニシンであることに言及する必要がありB::aます。つまり、 の値を変更することは許可されていませB::Func2ん。ただし、結果のオブジェクトを逆参照して変更することは許可されています。constaa
ここで、と 非操作class Bの両方がある場合、クラスの設計を変更する必要があります。上記のようにa を使用するように切り替え、すべての変更操作をカプセル化する別の a を追加すると、はるかに優れたものになります。さらに、プロパティ セッターの背後に隠されている必要があります。これにより、次のようなことができますconstconst*aclass Bconst A* aclass D : public Ba
class B {
const A* a;
public:
void setA(const A* a) { this->a = a; }
void Func2() const {}
};
class D : public B {
A* a;
public:
using B::setA;
void setA(A* a) {
this->a = a;
static_cast<B*>(this)->setA(const_cast<const A*>(a));
}
void Func3() { /* do something to D::a */ }
};
このスキームを使用すると、アクセスするオブジェクトへの適切に型指定された独立したポインターを維持できますB。、またはパラメータを指定して で呼び出されたD場合は、 のみが設定されます。が で呼び出された場合、と の両方が適切に設定されます。これが可能になったのは、セッターの背後でメンバーを抽象化することにより、パラメーターの constness でセッターをオーバーロードできるためです。setABDconst A*B::asetADA*B::aD::a