先决条件: C++中的访问修饰符,运行时多态
私有:声明为私有的类成员只能由该类内部的函数访问。类之外的任何对象或函数都不允许直接访问它们。只允许成员函数或朋友函数访问类的私有数据成员。
我们可以使用虚函数访问其他类中的私有方法,虚函数是在基类中声明并由派生类重新定义(重写)的成员函数。使用指针或对基类的引用来引用派生类对象可以调用该对象的虚函数并执行该派生类的函数版本。
程序1:演示私有访问修饰符
C++
// C++ program to demonstrate private
// access modifier
#include
using namespace std;
// Parent class having virtual
// function disp()
class Parent {
public:
// Create virtual function
virtual void disp()
{
cout << "This is the public disp"
<< " method of Parent class" << endl;
}
};
// Child class inherit to parent class
class Child : public Parent {
private:
int secret_key;
// Private method which will be called
// Overrride the method of parent class
void disp()
{
cout << "This is the private disp "
<< "method of child class "
<< endl;
cout << "The key is "
<< secret_key << endl;
}
public:
// Constructor of the child class
Child(int key) { secret_key = key; }
};
// Driver Code
int main()
{
// Create object of child class
Child child(1019);
// Upcasting
Parent* obj = &child;
// Function call of child class
obj->disp();
return 0;
}
C++
// C++ program to demonstrate protected
// access modifier
#include
using namespace std;
// Parent class having virtual
// function disp()
class Parent {
public:
// Create virtual function
virtual void disp()
{
cout << "This is the public disp"
<< " method of Parent class"
<< endl;
}
};
// Child class inherit to parent class
class Child : public Parent {
protected:
int secret_key;
// Private method which will be called
// Overrride the method of parent class
void disp()
{
cout << "This is the protected disp "
<< "method of child class "
<< endl;
cout << "The key is "
<< secret_key << endl;
}
public:
// Constructor of child class
Child(int key) { secret_key = key; }
};
// Driver Code
int main()
{
// Create object of child class
Child child(1019);
// Upcasting
Parent* obj = &child;
// Function call of child class
obj->disp();
return 0;
}
This is the private disp method of child class
The key is 1019
说明:
在上述程序中,父类具有一个虚函数函数void disp() 。子类创建了另一个具有相同名称的函数,即void disp(),但该函数是私有的,这意味着该类之外的任何对象或函数都不能直接访问该函数。在main()中,我们首先创建子类的对象,并传递一个参数以初始化子类中的secret_key变量,然后,我们将子类的对象的地址存储在基类指针中,这也称为cast 。。现在,基类指针保存子类对象的地址,但是当使用基类指针调用函数时,它将仅调用基类函数。但是如果要调用子类函数以使基类函数虚拟化。这也称为运行时多态。
受保护的:受保护的访问修饰符与私有访问修饰符相似,不同之处在于,声明为“受保护”的类成员在该类外部不可访问,但是该类的任何子类(派生类)都可以访问它们。
程序2:演示受保护的访问修饰符
C++
// C++ program to demonstrate protected
// access modifier
#include
using namespace std;
// Parent class having virtual
// function disp()
class Parent {
public:
// Create virtual function
virtual void disp()
{
cout << "This is the public disp"
<< " method of Parent class"
<< endl;
}
};
// Child class inherit to parent class
class Child : public Parent {
protected:
int secret_key;
// Private method which will be called
// Overrride the method of parent class
void disp()
{
cout << "This is the protected disp "
<< "method of child class "
<< endl;
cout << "The key is "
<< secret_key << endl;
}
public:
// Constructor of child class
Child(int key) { secret_key = key; }
};
// Driver Code
int main()
{
// Create object of child class
Child child(1019);
// Upcasting
Parent* obj = &child;
// Function call of child class
obj->disp();
return 0;
}
This is the protected disp method of child class
The key is 1019
说明:
在上面的示例中,父类具有函数void disp() ,它是一个虚函数。子类创建了另一个具有相同名称的函数,即void disp(),但该函数是私有的,这意味着该类之外的任何对象或函数都不能直接访问该函数。在main()中,我们首先创建一个子类的对象,并传递一个参数以初始化子类中的secret_key变量,此后,我们将子类的对象的地址存储在基类指针中,这也称为向上转换。现在,基类指针保存子类对象的地址,但是当使用基类指针调用函数时,它将仅调用基类函数。但是如果要调用子类函数以使基类函数虚拟化。这也称为运行时多态。