有没有办法禁止在C ++中转换为非const的子类?

时间:2009-05-08 07:48:26

标签: c++ inheritance const

这是一个完整的例子。 我想禁止使用A :: set从从B转换为A的对象,只允许转换 B到const A. 怎么做? (我不能使用虚函数)

#include <iostream>
#include <cassert>

using namespace std;

class A {
public:
  int  get() const { return i_; }
  void set(int i) { i_ = i; }
protected:
  int i_;
};

class B : public A {
public:
  int  ok() const { return A::get() == copy_i_; }
  void set(int i) { A::set(i); copy_i_ = i; }
protected:
  int copy_i_;
};

void test2() {
  A a;
  a.set(3); // ok here
  cout << a.get() << endl;

  B b;
  b.set(5);
  A& aa = b;
  assert(b.ok());
  aa.set(3); // not ok here
  assert(b.ok()); // fail-here
}

int main() {
  test2();
  return 0;
}

3 个答案:

答案 0 :(得分:2)

您可以将继承设为私有,并在B中提供成员函数以使用而不是强制转换。

const A& B::convert_to_A() const { return *this; }

答案 1 :(得分:0)

为什么要施法?使void A :: set(int i)受保护将适用于您的情况。

答案 2 :(得分:0)

没有必要禁止非const演员表。您可以使用template method design pattern解决问题。

#include "stdafx.h"
#include <iostream>
#include <cassert>

using namespace std;

class A {
public:
  int  get() const { return i_; }
  void set(int i) { assert(i_ = i); copy_i();}

protected:
  int i_;
  virtual void copy_i(){};
};


class B : public A {
public:
  int  ok() const { return A::get() == copy_i_; }
protected:
  int copy_i_;
  void copy_i(){copy_i_ = i_; }
};

void test2() {
  B b;
  b.set(5);
  A& a = b;
  assert(b.ok());
  a.set(3);
  assert(b.ok()); // success!
}

int main() {
  test2();
  return 0;
}