gpt4 book ai didi

c++ - 从同一个父调用调用不同的子类函数

转载 作者:行者123 更新时间:2023-11-30 03:26:21 25 4
gpt4 key购买 nike

考虑这个简单的 C++11 继承示例:

class A
{
public:
virtual void func() = 0;
};

class B : public A
{
public:
void func() { func1(); /* Wish this could be func1() or func2()! */ };

void func1() { /* Does one thing */ };
void func2() { /* Does another thing */ };
};

void doSomeStuff(A &a)
{
a.func();
}

int main()
{
B b;

doSomeStuff(b);

return 0;
}

我正在尝试这样做,这样我就不必修改(或复制)类 A 的定义或函数 doSomeStuff,但我希望调用 a.func() 来调用 func1() 或 func2 () of B. 理想情况下,我会将 doSomeStuff(b) 行更改为 doSomeStuff(b.butWithFunc1) 之类的内容,但我也可以通过某种方式修改 B 的 func() 版本,以便它可以根据某些参数在内部做出调用 func1func2 的决定。

在调用 func 期间,同一类型 B 的对象有时可能不得不调用 func1func2,所以我不能使用B 类的持久成员来决定。向 func() 添加一个参数也会使这变得微不足道,但这也不是我能做的。

我想知道是否有某种方法可以向 B 类添加一个函数,该函数返回从 func() 调用 func2() 的 B 类的变异版本,或者我是否可以使用函数指针或其他东西玩一些把戏.然而,有些事情告诉我我做错了,显而易见的解决方案就在眼前。

如果它对上下文有帮助,A 类类似于 std::lock_guard,并且它适用于信号量和互斥量(只有一个锁定和解锁定义)之类的东西,但在这个例子中是 B 类是一个 R/W 锁 - 所以有一个“readLock”和“writeLock”,我希望能够说“自动将此 RW 锁锁定为读锁”,而不必复制/破坏自动锁代码。

例如:

{
A_AutoSem(myMutex); // calls lock() on myMutex
//... do some stuff

// end of the block, ~A_AutoSem calls unlock on myMutex
}

{
A_AutoSem(B_RWLock); // how do I say here "call readLock"?
// ... do some stuff

// end of the block ~A_AutoSem should call "readUnlock" on B_RWLock
}

最佳答案

简单地定义一些额外的类来调用func1()func2(),然后将这些类传递给doSomeStuff()而不是直接传递 B

尝试这样的事情:

class A
{
public:
virtual void func() = 0;
};

class B
{
public:
void func1() { /* Does one thing */ };
void func2() { /* Does another thing */ };
};

class C1 : public A
{
private:
B &m_b;
public:
C1(B &b) : m_b(b) {}
void func() override { m_b.func1(); }
};

class C2 : public A
{
private:
B &m_b;
public:
C2(B &b) : m_b(b) {}
void func() override { m_b.func2(); }
};

void doSomeStuff(A &a)
{
a.func();
}

int main()
{
B b;

{
C1 c(b);
doSomeStuff(c);
}

{
C2 c(b);
doSomeStuff(c);
}

return 0;
}

Live Demo

或者:

class A
{
public:
virtual void func() = 0;
};

class B
{
private:
void func1() { /* Does one thing */ };
void func2() { /* Does another thing */ };

public:
class C1 : public A
{
private:
B &m_b;
public:
C1(B &b) : m_b(b) {}
void func() override { m_b.func1(); }
};

class C2 : public A
{
private:
B &m_b;
public:
C2(B &b) : m_b(b) {}
void func() override { m_b.func2(); }
};
};

void doSomeStuff(A &a)
{
a.func();
}

int main()
{
B b;

{
B::C1 c(b);
doSomeStuff(c);
}

{
B::C2 c(b);
doSomeStuff(c);
}

return 0;
}

Live Demo

关于c++ - 从同一个父调用调用不同的子类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com