C++重载基类内部调用

C++ overloading a base class internal call

本文关键字:调用 内部 基类 重载 C++      更新时间:2023-10-16

我想覆盖基类中的内部调用,并保持相同的接口和通用算法。更改取决于对象的状态,因此不能在构造函数中只设置一次。有办法让它发挥作用吗?或者可能是这样的设计模式?

#include <iostream>
using namespace std;
class X
{
private:
    virtual void internalCall()
    {
        cout << "Class X" << endl;
    }
public:
    X()
    {
        internalCall();
    }
    void externalCall()
    {
        internalCall();
    }
};
class Y : public X
{
protected:
    virtual void internalCall2()
    {
        cout << "Class Y2" << endl;
    }
    virtual void internalCall()
    {
        cout << "Class Y" << endl;
        internalCall2();
    }
    public:
    Y() : X() {}
};
int main()
{
    Y y;
    y.externalCall();
    return 0;
}

期望输出:

Y类

Y2级

Y类

Y2级

实际输出:

X类

Y类

Y2级

在我的机器上:

X类

X类

问题是您从X的构造函数调用internalCall()。尽管它是一个虚拟函数,但在调用X的构造函数时,Y还没有创建——所以您得到了XinternalCall()