If a private virtual function is overridden as a public function in the derived class, what are the problems?

前端 未结 3 1552
醉梦人生
醉梦人生 2020-12-03 16:17
using namespace std;
#include 
#include 

class One{
    private:
        virtual void func(){
            cout<<\"bark!\"<<         


        
3条回答
  •  感动是毒
    2020-12-03 16:39

    Accessibility check is performed based on the static type of the object. The type of o is One*. This means that if One::func() is private, then o->func() won't compile.

    On the other hand, which virtual member function will be called (i.e. dynamic dispatch) happens at run-time, based on the dynamic type of the object. So if One::func() is public, o->func() will call Two::func(), because o is pointing to an object of type Two.

    For your sample code and use case, making One::func() private is just meaningless. But note that there's a famous idiom called Non-Virtual Interface, which makes use of private virtual member functions of base class.


    Other suggestions:

    1. Don't forget to delete o;
    2. Add a virtual destructor in the base class One. Otherwise delete o; will lead to undefined behavior; e.g. the destructor of Two might not be invoked.

      class One {
          public:
              virtual ~One() {}
          // ...
      };
      

提交回复
热议问题