首页 文章

C:私有虚函数与纯虚函数[重复]

提问于
浏览
6

可能重复:C中的私有虚方法

如果我从这篇文章中正确理解(Private virtual method in C++),在基类中创建虚函数会使派生类能够覆盖它 . 但似乎事情停在那里 .

但是如果基类虚函数是纯函数,则强制派生类实现该函数 . 因此,纯(公共)虚拟功能仅仅是一个接口 . 我在这里可以看到一个好处 .

另一方面,通过将基类虚函数设为私有,只允许派生类重写函数,但我认为没有任何好处 . 这就好像私有虚拟功能甚至不存在 . 派生类显然不知道基类中是否存在该虚函数,因为它是私有的,因此在继承或多态方面声明基类私有函数virtual有什么好处吗?

此外,是否存在基类将声明函数“纯虚拟”和“私有”的情况?

谢谢 .

3 回答

  • 3

    一个好处是实现template method pattern

    class Base {
    
     public :
      void doSomething() {
        doSomething1();
        doSomething2();
        doSomething3();
      }
     private:
       virtual void doSomething1()=0;
       virtual void doSomething2()=0;
       virtual void doSomething3()=0;
    };
    
    
    class Derived : public Base {
      private:
       virtual void doSomething1() { ... }
       virtual void doSomething2() { .... }
       virtual void doSomething3() { .... }
    }
    

    这允许派生类实现某个逻辑的每个部分,而基类确定如何将这些部分放在一起 . 由于这些部分本身没有意义,因此它们被声明为 private ,因此隐藏在客户端代码之外 .

  • 12

    这是基于希望其子项实现基本身需要使用的功能的情况 . 想象一个愚蠢的例子 - 汽车 .

    class Car {
    public:
        int getTorque();
        int getPower();
    
    private:
        virtual const Engine& gimmeEngine() = 0;
    };
    
    class Ferrari : public Car {
    private:
        FerrariEngine myCoolEngine;
        const Engine& gimmeEngine() { return myCoolEngine; }
    };
    

    现在Car没有't need to know anything about Ferrari'的引擎,只是它实现了一些 Engine 接口,保证 Car 可以获得有关其功率和扭矩的信息 .

    在这个愚蠢的例子中,一切都可以通过使 getTorquegetPower 纯虚拟来简化,但我希望它能说明这个想法 . Base 需要使用它知道每个孩子必须具有的一些特定逻辑,因此它通过私有纯虚拟成员查询它 .

  • 0

    如果方法是虚拟的,它可以被派生类覆盖,即使它是私有的 . 无论如何,它应该被声明为受保护 .

相关问题