使用受保护的方法而不是为继承树中的每个派生类创建新的虚拟函数,这是一种好的做法吗.例如,在描述中

Is it good practice to use protected method instead of create new virtual function for each derived class in inheritance tree. E.g. in descritption

本文关键字:一种 描述 例如 函数 创建 方法 受保护 继承 派生 虚拟      更新时间:2023-10-16

例如,我有三级继承树,我需要在所有级别实现虚拟函数。哪种方式更好?

class Base {
    public:
    void foo() {
       //do something
        dFoo();
    }
    private:
    virtual void dFoo() = 0;
}
class DBase: public Base {
    private:
    void dFoo() {
        //do something
        ddFoo()
    }
    virtual void ddFoo() = 0;
}
class DDBase(): public DBase {
    private:
    void ddFoo() {
        //do something
    }
}

class Base {
    public:
    virtual void dFoo() { foo(); }
    protected:
    void foo() { //do something }
}
clase DBase: public Base {
    public:
    virtual void dFoo() {
       Base::foo();
       foo(); 
    }
    protected:
    void foo() { //do something }
}
clase DDBase: public DBase {
    public:
    virtual void dFoo() {
        Base::foo();
        DBase::foo();
        foo(); 
    }
    protected:
    void foo() { //do something }
}

我更喜欢第二种方式,但我读到受保护的方法是不好的做法。

Herb Sutter有一篇很好的文章《Virtuality》,你可能会觉得很有启发性。它建议将公共接口与派生类实现的行为分开(实现细节):使公共函数非虚拟,使虚拟函数非公共。

此设计用于std::basic_streambuf。

我认为这与解决方案看起来更好无关。这是关于你想要定义的接口。

由于非虚拟接口(nvi),第一种设计可能更稳定。

如果你限制了对虚拟函数的访问(例如,不公开它们),那么改变实现就更容易了,而不需要每个用户都更改代码并重新编译。

(Herb sutter有一篇关于这个话题的好文章:http://www.gotw.ca/publications/mill18.htm)

class Base {
    public:
        void foo () {
            vfoo();}
    protected:
        virtual void vfoo() {
            // do something
            }};
class DBase : public Base {
    protected:
        virtual void vfoo () {
            Base::vfoo();
            // do something
            }};
class DDBase : public DBase {
    protected:
        virtual void vfoo () {
            DBase::vfoo();
            // do something
            }};
int main () {
    DDBase x;
    Base&  r = x;
    r.foo();
    return 0;}
相关文章: