C ++:在编译与运行时禁用派生类中的虚函数

时间:2013-06-25 21:34:50

标签: c++ inheritance

我的父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.

有办法吗?

2 个答案:

答案 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);