1

我有一个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在编译时尽可能禁止。IE,

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.

有没有办法做到这一点?

4

2 回答 2

2

使用私有而不是公共继承。using使用关键字使父类的方法在子类中可用。

公共继承适用于使用父类对象的人也可能使用 chid 类对象的情况(有关详细信息,请参阅Liskov 替换原则)。你的要求打破了这一点,所以它不是公共继承的情况。

于 2013-06-25T21:43:16.317 回答
1

听起来class RO有一个不变量:“从不修改*p”(即使它偷偷摸摸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;
};

如果后续问题是:“DRY 怎么样?现在我必须实现read()两次?”,请注意,您可以在基类中定义静态成员函数,Readable例如:

    static void do_read(const int* p);
于 2013-06-25T22:35:35.810 回答