如何在子类中重写虚函数时是可以重新定义访问性的,即使父类中虚函数的访问性为 private,在子类中仍然可以重写为 public
时间: 2024-11-22 11:46:47 浏览: 10
在C++中,当在子类中重写父类的虚函数时,访问性规则有一定的灵活性。即使父类的虚函数被声明为私有(private),子类仍然可以提供公有(public)版本的实现。这是由于C++的设计允许子类增加其成员函数的可见性和可达性,即使这与父类的声明不符。
然而,这样的做法通常不建议,因为这违反了封装原则,使得子类对父类内部细节有了过多的直接控制。正确的做法是将父类的虚函数作为保护成员(protected)或者保持其原有的访问级别,除非有明确的理由需要从外部更方便地访问该函数。
如果你真的想这样做,你可以这样做:
```cpp
class Parent {
private:
virtual void myPrivateFunction() {}
};
class Child : public Parent {
public:
using Parent::myPrivateFunction; // 引入父类的虚函数并声明为公共
virtual void myPublicFunction() override { myPrivateFunction(); } // 实现公有的版本
};
```
在这个例子中,`Child` 可以在其公开接口上提供一个名为 `myPublicFunction` 的公共方法,实际调用的是被重写的父类的私有虚函数 `myPrivateFunction`。
相关问题
C++ 子类重写父类的接口,为什么子类这个接口的访问权限可以和父类不一致
在C++中,子类重写父类的接口时,子类可以选择将接口方法的访问权限设置为与父类不一致。这是因为C++中的虚函数(即接口方法)的访问权限是相对于类而言的,而不是相对于父类或子类而言的。因此,子类可以通过继承和重写父类的虚函数,来实现不同的访问权限控制。
在C++中,虚函数可以被声明为public、protected或private。如果子类想要重写一个父类的虚函数,但是将其访问权限设置为比父类更严格的权限,比如将其设置为private,那么子类就无法通过该虚函数来调用父类的方法,这样会破坏了虚函数的多态特性。因此,一般来说,子类在重写父类的虚函数时,应该将其访问权限设置为与父类相同或更宽松的权限,这样才能保证虚函数的多态特性。
阅读全文