纯虚拟朋友 Class
Pure Virtual Friend Class
我有 class A
,它有一个指向纯虚拟实例的指针 class B
。 Class C
派生自 B
并将自动具有指向 A
(其父级)的指针,并且需要访问其成员。这可以通过在 class A
中添加 friend class C
来实现,尽管这对于将从 B
.
派生的每个 class 都是必需的
代码示例:
class A
{
public:
friend class B; // This does not allow derived classes to be friends
friend class C; // Now derived class B has access to `DoDomething`, but then this is needed for every single derived class
private:
void DoDomething();
};
class B
{
virtual void Tick() = 0;
protected:
A* m_pointerToA; // <- is being set upon creating automatically
};
class C : public class B
{
virtual void Tick()
{
m_pointerToA->DoSomething();
}
};
有没有办法让 B
的所有派生 classes 都可以访问它们指向的 class A
的私有和受保护成员,而无需必须为每个添加 friend class X
?
由于友谊不被继承,你需要将所有依赖于友谊的功能包装到基classB
的受保护函数中。这将使所有从 B
派生的 classes 访问需要 "befriending":
的 A
的功能
class B {
virtual void Tick() = 0;
protected:
A* m_pointerToA; // <- is being set upon creating automatically
void callDoSomething() {
m_pointerToA->DoSomething();
}
};
class C : public class B {
virtual void Tick() {
std::cout << "Class C is about to tick..." << std::endl;
callDoSomething();
}
};
class D : public class B {
virtual void Tick() {
callDoSomething();
std::cout << "Class D has just ticked!" << std::endl;
}
};
这有效地将 class 层次结构中使用友谊的区域本地化为 class B
,这有助于封装。
我有 class A
,它有一个指向纯虚拟实例的指针 class B
。 Class C
派生自 B
并将自动具有指向 A
(其父级)的指针,并且需要访问其成员。这可以通过在 class A
中添加 friend class C
来实现,尽管这对于将从 B
.
代码示例:
class A
{
public:
friend class B; // This does not allow derived classes to be friends
friend class C; // Now derived class B has access to `DoDomething`, but then this is needed for every single derived class
private:
void DoDomething();
};
class B
{
virtual void Tick() = 0;
protected:
A* m_pointerToA; // <- is being set upon creating automatically
};
class C : public class B
{
virtual void Tick()
{
m_pointerToA->DoSomething();
}
};
有没有办法让 B
的所有派生 classes 都可以访问它们指向的 class A
的私有和受保护成员,而无需必须为每个添加 friend class X
?
由于友谊不被继承,你需要将所有依赖于友谊的功能包装到基classB
的受保护函数中。这将使所有从 B
派生的 classes 访问需要 "befriending":
A
的功能
class B {
virtual void Tick() = 0;
protected:
A* m_pointerToA; // <- is being set upon creating automatically
void callDoSomething() {
m_pointerToA->DoSomething();
}
};
class C : public class B {
virtual void Tick() {
std::cout << "Class C is about to tick..." << std::endl;
callDoSomething();
}
};
class D : public class B {
virtual void Tick() {
callDoSomething();
std::cout << "Class D has just ticked!" << std::endl;
}
};
这有效地将 class 层次结构中使用友谊的区域本地化为 class B
,这有助于封装。