关于继承/方法重写C ++的问题

时间:2010-02-18 19:25:49

标签: c++

class Class1
{
public:
    void print()
    {
        cout << "test" << endl;
    }

    void printl()
    {
        print();
    }
};

class Class2 : public Class1
{
public:
    void print()
    {
        cout << "test2" << endl;
    }
};

为什么print()不会在Class2中被覆盖,是否有任何方式可以像这样覆盖一个函数? (没有虚函数)。感谢

    Class2 t;
    t.printl();

5 个答案:

答案 0 :(得分:10)

没有。这是虚函数的全部原因。

这里没有虚方法,当printl()调用print()时,它调用Class1.print(),打印“test”。如果您将方法标记为虚拟,那么它将按照您的预期处理它。

答案 1 :(得分:3)

不,没有办法覆盖非虚函数。这就是虚拟功能的用途。

答案 2 :(得分:2)

您想要的是一个虚拟方法。只需在当前virtual void print()的位置写下void print(),它就可以正常运行。请注意,这在构造函数或析构函数中不起作用。

答案 3 :(得分:0)

printl内部打印调用未被覆盖,因为它不是虚方法。它是一种非虚方法,因此被非虚拟地调用。如果您希望被子类覆盖,则将其设为虚拟。

答案 4 :(得分:0)

想象一下,你有Class2,Class3和Class3,都是“覆盖”Class1的“打印”方法。

当调用Class1 :: printl时 - 如何知道要调用的3个覆盖中的哪一个?如果没有虚方法,printl实现无法知道选择哪种重写方法。