如何在C++类外部访问私有/保护方法
私有: 声明为 private的类成员仅可以由类内的函数访问。它们不允许直接被任何对象或函数在类外部访问。只有成员函数或友元函数才可以访问类的私有数据成员。
我们可以使用虚函数在其他类中访问私有方法,虚函数是在基类中声明并由派生类重新定义(覆盖)的成员函数。使用指向基类的指针或引用引用派生类对象,可以为该对象调用虚函数并执行派生类的版本。
程序1: 演示私有访问修饰符
// C ++程序演示私有
//访问修饰符
#include
using namespace std;
//父类具有虚拟
//函数分散()
class Parent {
public:
//创建虚拟函数
virtual void disp()
{
cout << "这是公共的disp"
<< "父类的方法" << endl;
}
};
// Child类继承到父类
class Child: public Parent {
private:
int secret_key;
//将调用的私有方法
//覆盖父类的方法
void disp()
{
cout << "这是私有disp"
<< "孩子类"
<< endl;
cout <<“密钥是”
<< secret_key << endl;
}
public:
// child类的构造函数
Child(int key){secret_key = key; }
};
//驱动程序
int main()
{
//创建child类对象
Child child(1019);
//向上转型
Parent * obj =&child
//调用child类函数
obj->disp();
return 0;
}
输出:
这是私有的disp方法 child class
密钥是1019
解释:
在上面的程序中,父类有一个函数 void disp() 是一个 虚拟 函数。Child类已经创建了另一个名称相同的函数,即void disp()但该函数是私有的,这意味着不能直接通过类外的任何对象或函数来访问它。在main()中,首先创建child类的对象并传递参数以初始化 secret_key 变量,之后,我们将child类对象的地址存储在基类指针中,这也称为 向上转型 。现在,基类指针保存了child类对象的地址,但是当使用基类指针调用函数时,它只会调用基类函数。但是如果想要调用child类函数以使基类函数 虚拟 。这也称为 运行时多态性。
保护: protected访问修饰符与私有访问修饰符类似,其区别在于被声明为Protected的类成员在类外部是不可访问的,但它们可以被任何该类的子类(派生类)访问。
程序2: 演示保护访问修饰符
// C++程序演示了protected访问修饰符
// 包括
#include <iostream>
using namespace std;
// 父类拥有虚函数disp()
class Parent {
public:
// 创建虚函数
virtual void disp()
{
cout << "这是父类的公共disp"
<< " Parent class"
<< endl;
}
};
// 子类继承父类
class Child : public Parent {
protected:
int secret_key;
// 被调用的私有方法
// 覆盖父类的方法
void disp()
{
cout << "这是子类的protected disp方法"
<< " The method of child class "
<< endl;
cout << "密钥是 "
<< secret_key << endl;
}
public:
// 子类构造函数
Child(int key) { secret_key = key; }
};
// 主要代码
int main()
{
// 创建子类对象
Child child(1019);
// 向上转型
Parent* obj = &child
// 子类函数调用
obj->disp();
return 0;
}
输出:
这是子类的protected disp方法
密钥是1019
说明 :
在上面的例子中,父类有函数 void disp() 是一个 虚函数 。子类创建了另一个同名函数即void disp(),但该函数是私有函数,这意味着它不能直接被类外的任何对象或函数访问。在main()中,我们首先创建了子类的对象并传递一个参数来初始化子类中的secret_key变量,然后我们将子类对象的地址存储在基类指针中,这也被称为 向上转型(upcasting) 。现在基类指针持有子类对象的地址,但在使用基类指针调用函数时,它只会调用基类函数。但是,如果想调用子类函数,将基类函数 虚函数 。这也被称为 运行时多态(runtime polymorphism) 。 **