在C ++中对派生类方法进行更严格的访问时会发生什么

在本节中,我们将讨论有关C ++中派生类方法的限制性访问的有趣事实。我们将看到一些示例并分析输出,以了解有关在C ++中使用派生类方法的限制的更多信息。

范例(C ++)

让我们看下面的实现以更好地理解-

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
}

很好,现在如果我们用这个替换主功能块,我们将得到如下错误:

int main() {
   DerivedClass d;
   d.display();
}

输出结果

main.cpp: In function ‘int main()’:
main.cpp:20:15: error: ‘virtual void DerivedClass::display()’ is private
within this context
d.display();
^
main.cpp:13:10: note: declared private here
void display() {
^~~~~~~

由于派生类中的方法是私有的,因此显示错误。现在让我们看一下该实现,其中使用基本指针调用该函数。这可以调用该函数。

范例(C ++)

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
   BaseClass *b = new DerivedClass;
   b->display();
}

输出结果

Print function from the derived class

从上面的程序中,我们可以看到私有函数DerivedClass::display()是通过基类指针被调用的,由于display()函数在基类中是公共的,所以该程序可以正常工作。访问说明在编译时进行验证,并且display()在基类中是公共的。在运行期间,仅调用与指向对象相对应的函数,并且不验证访问说明符。因此,派生类的私有函数通过基类的指针被调用。

猜你喜欢