我的父class RO
有一个方法void setup(const int* p)
。我需要一个子class RW
来使用只允许非常量指针的方法。
我是通过在class RO
中创建两个方法并在class RW
中禁止其中一个方法来实现的:
class RO
{
public:
void setup(int* p) { DO SMTH }
virtual void setup (const int* p) { RO::setup( const_cast<int*>(p) ); }
// the rest...
void read() const;
};
class RW : public RO
{
public:
virtual void setup (const int* p) { throw SMTH }
// the rest...
void write();
};
我希望能够在编译时尽可能禁止RW::setup
。即,
const int* p;
RO* ro = new RW;
ro->setup(p); // Throw at run time, since it can be unknown
// at compile time that ro points to RW and not to RO.
RW* rw = new RW;
rw->f(p); // Disallow this at compile time, since it is
// known at compile time that rw points to RW.
有办法吗?
答案 0 :(得分:2)
使用私有而非公共继承。使用using
关键字在子类中创建父类的方法。
公共继承适用于使用父类对象的人也可以使用chid类对象的情况(查找详细信息Liskov substitution principle)。你的要求打破了这一点,因此公共继承并非如此。
答案 1 :(得分:1)
听起来class RO
有一个不变量:&#34;永远不会修改*p
&#34; (即使它在const_cast
上做了偷偷摸摸的p
)。如果class RW
违反了该不变量,则它不能是class RO
的子类。
我猜你真正想要的更像是:
class Readable {
public:
virtual ~Readable();
virtual void read() const = 0;
};
class RO
: public Readable {
public:
void setup(const int* p);
void read() const;
private:
const int* m_p;
};
class RW
: public Readable
{
public:
void setup(int* p);
void read() const;
void write();
private:
int* m_p;
};
如果后续问题是:&#34; DRY怎么样?现在我必须实现read()
两次?&#34;,请注意您可以在基类Readable
中定义静态成员函数,例如:
static void do_read(const int* p);