我面临的情况是我需要在父类中访问子成员变量.我知道这是违反OO原则的,但我必须处理一个场景,其中有数百个类继承自一个类,并且其中一半停止使用其中一个父变量,并声明并使用它们自己(需要切换)从int到int [],显然那个人没有考虑在父类中应用这些更改.
一种选择是使用虚拟函数来处理它,但这意味着我必须更改数百个文件/对象中的代码并测试它们中的每一个.因此,我认为如果可以使用一些旧的学校C指针魔术来获取父方法内部的这些变量,这将消除数百个虚函数的需要.
基本上这就是我想要实现的目标:
class Parent
{
void DoSomething()
{
// This is what I need
childMember = 0;
}
}
class Child1 : Parent
{
int childMember;
}
class Child2 : Parent
{
int childMember;
}
Run Code Online (Sandbox Code Playgroud)
如果可能,请告诉我.如果是,我该如何实现.
欢迎其他建议,但请记住,我只想在父类中进行更改.
TIA.
唯一干净的方法是使用虚函数方法.
如果Parent
该类至少有一个虚函数(不一定DoSomething
),那么还有一种令人讨厌的方法:
void DoSomething() {
if (Child1* child = dynamic_cast<Child1*>(this)) {
child->childMember = 0;
} else if (Child2* child = dynamic_cast<Child2*>(this)) {
child->childMember = 0;
} // and so on, and so forth
}
Run Code Online (Sandbox Code Playgroud)
(如果Parent
没有虚函数,则dynamic_cast
无法工作.但是,任何设计为继承的类都应该至少有一个虚函数,即使它只是析构函数.)
可能 CRTP 在这里有帮助:
struct Parent
{
virtual void DoSomething() = 0;
};
template <typename Derived>
struct ParentProxy : Parent
{
virtual void DoSomething()
{
Derived* p = dynamic_cast<Derived*>(this);
p->childMember = 27;
}
};
struct Child1 : ParentProxy<Child1>
{
int childMember;
};
struct Child2 : ParentProxy<Child2>
{
int childMember;
};
int main()
{
Child1 child1;
Child2 child2;
Parent* objects[] = { &child1, &child2 };
const int objectCount = sizeof(objects) / sizeof(objects[0]);
for (int index = 0; index < objectCount; ++index)
{
Parent* parent = objects[index];
parent->DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我更改了可编译的代码 - 可能不是您的要求 - 但随后提供了更好的(=可编译的)示例代码。
归档时间: |
|
查看次数: |
25392 次 |
最近记录: |