c++ - 重写的虚函数没有被调用

标签 c++ inheritance function virtual

代码的更精确版本是:

class SomeParam;
class IBase
{
public:
    virtual void Func(SomeParam* param = NULL)
    {
        cout << "Base func";
    }
};

class DerivedA : public IBase
{
public:
    void Func()
    {
        //do some custom stuff
        cout << "DerivedA func";
        IBase::Func();
    }
};

class DerivedB : public IBase
{
public:
    void Func()
    {
        //do some custom stuff
        cout << "DerivedB func";
        IBase::Func();
    }
};

//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
    IBase *i1 = instance1;
    IBase *i2 = instance2;
    i1->Func();
    i2->Func();
}

DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);

这给了我:
“基础功能”
“基础功能”

最佳答案

看起来您提供了代码的简化版本以使其更具可读性,但您无意中过度简化了。

您的行为最可能的原因是:

  • FuncCaller() 中切片(有关详细信息,请参阅 quamrana 的回答)
  • 错误的覆盖,比如派生类函数const,而基类函数不是const

编辑:阅读编辑后的问题后,显然是第二个原因。您并没有覆盖基类函数,而是将其隐藏在具有新定义的派生类中。您需要在派生类中保持完全相同的签名(协变在这里不适用,因为函数返回 void)。在代码中,您需要执行以下任一操作:

class SomeParam;
class IBase
{
public:
    virtual void Func(SomeParam* param = NULL)
    {
        cout << "Base func";
    }
};

class DerivedA : public IBase
{
public:
    void Func(SomeParam* param = NULL)
    {
        //do some custom stuff
        cout << "DerivedA func";
        IBase::Func();
    }
};

class DerivedB : public IBase
{
public:
    void Func(SomeParam* param = NULL)
    {
        //do some custom stuff
        cout << "DerivedB func";
        IBase::Func();
    }
};

//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
    IBase *i1 = instance1;
    IBase *i2 = instance2;
    i1->Func();
    i2->Func();
}

DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);

class SomeParam;
class IBase
{
public:
    virtual void Func()
    {
        cout << "Base func";
    }
};

class DerivedA : public IBase
{
public:
    void Func()
    {
        //do some custom stuff
        cout << "DerivedA func";
        IBase::Func();
    }
};

class DerivedB : public IBase
{
public:
    void Func()
    {
        //do some custom stuff
        cout << "DerivedB func";
        IBase::Func();
    }
};

//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
    IBase *i1 = instance1;
    IBase *i2 = instance2;
    i1->Func();
    i2->Func();
}

DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);

关于c++ - 重写的虚函数没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2317559/

相关文章:

c++ - 如何添加或减去数组的一部分?

c++ - 为什么 C++ 按位 AND 运算符对不同大小的操作数表现得像这样?

c++ - OpenCv 填充单 channel 图像的像素并显示

c# - 重铸为派生类型

python - 如何对返回相同类型的类实例的两个类实例(以 float 作为子类)执行算术?例如速度(2) + 速度(2)

Javascript 函数没有正确接收参数

c++ - 为什么 std::bind 可以分配给参数不匹配的 std::function?

c++ - 使用 floodfill c++ 填充矩形

java - 使用返回父类(super class)对象的父类(super class)方法 - Java

python - Pygame 不响应按键