友元函数是一种特殊的非成员函数,它可以访问类的私有和保护成员。通过将一个函数声明为类的友元,可以允许该函数访问类的私有和保护成员。
继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的属性和方法。继承可以分为公有继承、保护继承和私有继承。
#include <iostream>
class Base {
private:
int privateData;
public:
Base(int data) : privateData(data) {}
// 声明友元函数
friend void accessPrivateData(Base& obj);
// 声明虚函数
virtual void display() {
std::cout << "Base class display: " << privateData << std::endl;
}
};
// 定义友元函数
void accessPrivateData(Base& obj) {
std::cout << "Private data: " << obj.privateData << std::endl;
}
class Derived : public Base {
public:
Derived(int data) : Base(data) {}
// 重写虚函数
void display() override {
std::cout << "Derived class display: " << privateData << std::endl;
}
};
int main() {
Base base(10);
Derived derived(20);
base.display();
derived.display();
accessPrivateData(base);
accessPrivateData(derived);
return 0;
}
问题:友元函数无法访问派生类的私有和保护成员。
原因:友元函数只被授予访问基类私有和保护成员的权限,而没有被授予访问派生类私有和保护成员的权限。
解决方法:可以通过在派生类中再次声明友元函数来解决这个问题。
class Derived : public Base {
private:
int derivedPrivateData;
public:
Derived(int data) : Base(data), derivedPrivateData(data * 2) {}
// 再次声明友元函数
friend void accessPrivateData(Base& obj);
};
void accessPrivateData(Base& obj) {
std::cout << "Base private data: " << obj.privateData << std::endl;
Derived* derived = dynamic_cast<Derived*>(&obj);
if (derived) {
std::cout << "Derived private data: " << derived->derivedPrivateData << std::endl;
}
}
通过这种方式,友元函数可以访问基类和派生类的私有和保护成员。
云+未来峰会
T-Day
云+社区沙龙online第6期[开源之道]
serverless days
云+社区技术沙龙 [第31期]
云+社区技术沙龙[第18期]
Elastic 中国开发者大会
Elastic 中国开发者大会
云+社区技术沙龙第33期
腾讯技术创作特训营第二季
领取专属 10元无门槛券
手把手带您无忧上云