C++:从属性类调用顶级类方法

C++: call a top class method from the attribute class

本文关键字:类方法 调用 从属性 C++      更新时间:2023-10-16

我想从子类调用父类的方法。

代码如下:

#include "stdio.h"
class Parent;
typedef void (Parent::*fff)(void);
// Attribute class
class Child {
public:
Child( fff ftp );
void (Parent::*fptr)(void);
void update();
};
Child::Child( fff ftp )
{
fptr = ftp;
}
void Child::update()
{
(this->*fptr)(); // fail and I don't know the correct syntax 
printf("update donen");    
}
// Top class
class Parent {
public:
Parent();
Child child;
void foo();
};

Parent::Parent():
child( &Parent::foo )
{
(this->*child.fptr)(); // works and print "foo"
}
void Parent::foo()
{
printf("foon");
}
int main()
{
Parent parent;
parent.child.update();
}

此代码失败。我收到以下错误:"错误:指向成员类型'void(父级::)(('的指针与对象类型'子级'不兼容">

这可能很明显,但我找不到正确的语法。知道吗?

工作案例(删除不相关的细节(:

Parent::Parent()
// ^ (!)
{
(this->*child.fptr)();
}

this的类型为Parent,因此您可以使用它来调用Parent函数。

非工作案例:

void Child::update()
//     ^ (!)
{
(this->*fptr)(); 
}

this的类型是Child,但成员函数指针引用类Parent,所以你有不匹配的参数类型(但这不是语法问题,这是正确的(。情况与以下情况相当:

class C
{
public:
static void f(C* c);
};
class D
{
public:
void f()
{
C::f(this); // fails, 'this' is not C*, but D*!
}
}

物质会改变,如果你让Child继承Parent.这是否合适取决于用例,但由于Child已经是Parent的聚合成员,因此在给定的场景中甚至是不可能的。