C++ 多态静态可变 Child 函数指针
C++ Polymorphic Static Changeable Child Function Pointer
我有一个 class A 是 class B 的 child,我需要 class B 的所有 children 有一个功能指向用于处理 class 的函数的指针,在编译 classes 后,该函数可由不同文件中的外部函数更改。 class A的所有实例都应该指向一个函数,B的所有实例都应该指向一个函数,但是A和B应该可以指向不同的函数。我怎样才能做到这一点?我尝试了静态函数指针和私有静态函数指针,但都没有用。
class B{
public:
static void (* func)();
}
class A : public B{
}
class C : public B{
}
void funcA(){
cout<<"A"<<endl;
}
void funcB(){
cout<<"B"<<endl;
}
void funcC(){
cout<<"C"<<endl;
}
void main(){
B b=B();
B b2=B();
B a=A();
B a2=A();
B c=C();
B c2=C();
b.func=funcB;
a.func=funcA;
c.func=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
}
我想要的输出是
B
A
C
B
A
C
如果您希望派生 class 的所有实例共享相同的 function-pointer,您需要在每个 class.
中放置一个 function-pointer
如果您想要 classes 的多态行为,您的问题并不清楚,但我在这个答案中是这样假设的。如果将虚函数和静态函数指针组合在一起,您可以获得所需的行为。
#include <iostream>
using fptr = void (*)();
class B {
public:
virtual void func() {
bfunc();
}
static fptr bfunc;
};
fptr B::bfunc;
class A : public B{
public:
void func() override {
afunc();
}
static fptr afunc;
};
fptr A::afunc;
class C : public B{
public:
void func() override {
cfunc();
}
static fptr cfunc;
};
fptr C::cfunc;
void funcA(){
std::cout<<"A"<<std::endl;
}
void funcB(){
std::cout<<"B"<<std::endl;
}
void funcC(){
std::cout<<"C"<<std::endl;
}
int main(){
B b=B();
B b2=B();
A a=A();
A a2=A();
C c=C();
C c2=C();
B::bfunc=funcB;
A::afunc=funcA;
C::cfunc=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
B* c3 = new C;
c3->func();
delete c3;
}
我有一个 class A 是 class B 的 child,我需要 class B 的所有 children 有一个功能指向用于处理 class 的函数的指针,在编译 classes 后,该函数可由不同文件中的外部函数更改。 class A的所有实例都应该指向一个函数,B的所有实例都应该指向一个函数,但是A和B应该可以指向不同的函数。我怎样才能做到这一点?我尝试了静态函数指针和私有静态函数指针,但都没有用。
class B{
public:
static void (* func)();
}
class A : public B{
}
class C : public B{
}
void funcA(){
cout<<"A"<<endl;
}
void funcB(){
cout<<"B"<<endl;
}
void funcC(){
cout<<"C"<<endl;
}
void main(){
B b=B();
B b2=B();
B a=A();
B a2=A();
B c=C();
B c2=C();
b.func=funcB;
a.func=funcA;
c.func=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
}
我想要的输出是
B
A
C
B
A
C
如果您希望派生 class 的所有实例共享相同的 function-pointer,您需要在每个 class.
中放置一个 function-pointer如果您想要 classes 的多态行为,您的问题并不清楚,但我在这个答案中是这样假设的。如果将虚函数和静态函数指针组合在一起,您可以获得所需的行为。
#include <iostream>
using fptr = void (*)();
class B {
public:
virtual void func() {
bfunc();
}
static fptr bfunc;
};
fptr B::bfunc;
class A : public B{
public:
void func() override {
afunc();
}
static fptr afunc;
};
fptr A::afunc;
class C : public B{
public:
void func() override {
cfunc();
}
static fptr cfunc;
};
fptr C::cfunc;
void funcA(){
std::cout<<"A"<<std::endl;
}
void funcB(){
std::cout<<"B"<<std::endl;
}
void funcC(){
std::cout<<"C"<<std::endl;
}
int main(){
B b=B();
B b2=B();
A a=A();
A a2=A();
C c=C();
C c2=C();
B::bfunc=funcB;
A::afunc=funcA;
C::cfunc=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
B* c3 = new C;
c3->func();
delete c3;
}