In C++, protected members cannot be accessed outside the class and its derived classes using obj.membername
#include <QtCore>
//#include "windows.h"
//#include <QApplication>
class A
{
public:
void fun()
{
qDebug()<<"a";
A a;
a.aa=123;
this->aa=123;
A::aa=123;
}
protected:
int aa;
};
class B
{
public:
void fun()
{
A a;
a.aa=123; //illegal
}
};
class AA:public A
{
void fun()
{
//A*pa=new A;
A::aa=123;
this->aa=123;
aa=123;
AA aa;
aa.aa=123;
A a;
a.aa=123; //illegal
}
};
int main(int argc, char *argv[])
{
A a;
// a.a=123;
a.aa=123; //illegal
// A::aa=123;
return 0;
}
Protected members can be visited in the derived classes using the member name directly, parentclass::membername, this->membername, subclassobj.membername, but cannot be accessed using parentclassobj.membername.
Protected members in Java behavior differently due to the existence of package. They are like public members for non-derived classes in the same package. They can be accessed using obj.membername, while this is not true in C++. For non-derived classes in different packages, they are not accessible. In derived classes in the same package, they can be accessed using parentclassobj.membername(which is not true in C++), subclassobj.membername, membername itself. For derived classes that are not in the same package, they can be accessed by membername, subclassobj.membername, but cannot be accessed using parentclassobj.membername. So the cross-package access for protected members in Java keeps the same as in C++.
//App.java
package fruit;
public class App
{
String a="aa";
protected void fun()
{
System.out.println("in App");
}
}
class App1
{
String a="aa";
void fun()
{
App app=new App();
app.fun();
System.out.println("in App1");
}
}
class App2 extends App
{
String a="aa";
void fun1()
{
App app=new App();
app.fun();
fun();
App2 app2=new App2();
app2.fun();
System.out.println("in App2");
}
}
//Test.java
import fruit.App;
class Test extends App
{
String a="aa";
public static void main(String[] args)
{
App app=new App();
//app.fun();
//fun();
System.out.println("hello");
}
void fun2(/*App app*/)
{
fun();
Test app=new Test();
app.fun();
App ap=new App();
ap.fun();//illegal
}
}
Comments are closed, but trackbacks and pingbacks are open.