C++ 中的向上转型是否允许访问父级的私人成员或朋友
Does Upcasting in C++ Allow Access to Parent's Private Members or Friends
根据我在 class 中学到的知识,派生的 class 不会继承其父 class 的:
- Constructors/Destructors
- 好友
- 私人会员
然而,如果我们将派生的 class 向上转型到它的父 class,我们是否可以访问父 class 的私有成员并且父 class的朋友现在申请这个被抛弃的class?
我倾向于认为向上转换的派生 class 将无法访问父级的私有方法和变量,因为派生 class 一开始就没有继承它们是有原因的.
(以下代码是验证答案验证后添加的)
此c++代码用于测试我提出的问题:
#include <iostream>
class A;
void funcGetAVal(A);
class A
{
private:
int aVal;
friend void ::funcGetAVal(A);
public:
A()
{
aVal = 0;
}
};
class B : public A
{
public:
int bVal;
B() : A()
{
bVal = 0;
}
};
void funcGetAVal(A aClass)
{
std::cout << "A val accessed from friend function: " << aClass.aVal << std::endl;
}
int main()
{
B * b = new B;
A * a = new A;
A * bNowA = reinterpret_cast<A *>(b); //This reinterprets the instance of the derived class into an instance of the base class
//std::cout << bNowA->aVal << std::endl; //This caused a compile-time error since aVal is a private member of A
::funcGetAVal(*a); //This calls the funcGetAVal function with an instance of the base class
::funcGetAVal(*bNowA); //This calls the funcGetAVal function with an instance of the derived class reinterpreted as the base class
//Both funcGetAVal function calls print out 0
return 0;
}
结果与R Sahu的回答一致。从 B 的实例访问 A 的私有成员导致错误,友元函数能够访问派生的 class 的 aVal.
However if we upcasted the derived class to its parent class, would we have access to the private members of the parent class
没有
private
class 的成员可在 class 的范围内访问。 class 的成员函数可以访问其私有成员。通过将派生 class 指针向上转换为基 class 指针中的基 class 指针,该函数不是基 class 的成员函数,您将无法访问 private
基地成员class。您只能访问它的 public
个成员。
and would the Parent class's friends now apply to this upcasted class?
如果将指向基class的指针传递给基class的friend
,则友元函数可以访问private
和protected
基地成员class.
根据我在 class 中学到的知识,派生的 class 不会继承其父 class 的:
- Constructors/Destructors
- 好友
- 私人会员
然而,如果我们将派生的 class 向上转型到它的父 class,我们是否可以访问父 class 的私有成员并且父 class的朋友现在申请这个被抛弃的class?
我倾向于认为向上转换的派生 class 将无法访问父级的私有方法和变量,因为派生 class 一开始就没有继承它们是有原因的.
(以下代码是验证答案验证后添加的)
此c++代码用于测试我提出的问题:
#include <iostream>
class A;
void funcGetAVal(A);
class A
{
private:
int aVal;
friend void ::funcGetAVal(A);
public:
A()
{
aVal = 0;
}
};
class B : public A
{
public:
int bVal;
B() : A()
{
bVal = 0;
}
};
void funcGetAVal(A aClass)
{
std::cout << "A val accessed from friend function: " << aClass.aVal << std::endl;
}
int main()
{
B * b = new B;
A * a = new A;
A * bNowA = reinterpret_cast<A *>(b); //This reinterprets the instance of the derived class into an instance of the base class
//std::cout << bNowA->aVal << std::endl; //This caused a compile-time error since aVal is a private member of A
::funcGetAVal(*a); //This calls the funcGetAVal function with an instance of the base class
::funcGetAVal(*bNowA); //This calls the funcGetAVal function with an instance of the derived class reinterpreted as the base class
//Both funcGetAVal function calls print out 0
return 0;
}
结果与R Sahu的回答一致。从 B 的实例访问 A 的私有成员导致错误,友元函数能够访问派生的 class 的 aVal.
However if we upcasted the derived class to its parent class, would we have access to the private members of the parent class
没有
private
class 的成员可在 class 的范围内访问。 class 的成员函数可以访问其私有成员。通过将派生 class 指针向上转换为基 class 指针中的基 class 指针,该函数不是基 class 的成员函数,您将无法访问 private
基地成员class。您只能访问它的 public
个成员。
and would the Parent class's friends now apply to this upcasted class?
如果将指向基class的指针传递给基class的friend
,则友元函数可以访问private
和protected
基地成员class.