好的,所以我试图在父类中重写一个函数,并出现一些错误。这是一个测试用例

#include <iostream>
using namespace std;

class A{
public:
    int aba;
    void printAba();
};

class B: public A{
    public:
    void printAba() new;
};

void A::printAba(){
    cout << "aba1" << endl;
}

void B::printAba() new{
    cout << "aba2" << endl;
}

int main(){
    A a = B();

    a.printAba();

    return 0;
}

这是我遇到的错误:
Error   1   error C3662: 'B::printAba' : override specifier 'new' only allowed on member functions of managed classes   c:\users\test\test\test.cpp 12  test
Error   2   error C2723: 'B::printAba' : 'new' storage-class specifier illegal on function definition   c:\users\test\test\test.cpp 19  test

我该怎么办?

最佳答案

无需在派生类中放置任何关键字来覆盖函数。

class B: public A{
    public:
    void printAba();
};

但是基类的方法应该是虚拟的,以允许根据变量的实际身份选择方法。
class A{
public:
    int aba;
    virtual void printAba();
};

如果您在堆栈上创建一个B并将其复制到A中,slicing would occur。您应该在堆上创建一个B并将指针转换为A。
A* a = new B();
a->printAba();  // if printAba is not virtual, A::printAba will be called.
delete a;

09-25 18:51