MST

星途 面试题库

面试题:C++ 子类重写父类虚函数的基本规则

请描述在C++中,子类重写父类虚函数时,函数签名(参数列表、返回类型等)需要遵循哪些规则?如果返回类型是指针或引用,有什么特殊要求?
11.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 函数签名规则
    • 参数列表:子类重写的虚函数参数列表必须与父类中被重写的虚函数参数列表完全相同。包括参数的个数、类型及顺序都要一致。例如:
    class Parent {
    public:
        virtual void func(int a, double b) = 0;
    };
    class Child : public Parent {
    public:
        void func(int a, double b) override {
            // 具体实现
        }
    };
    
    • 返回类型:一般情况下,返回类型必须与父类虚函数的返回类型完全相同。例如上述代码中,如果Parent::func返回voidChild::func也必须返回void
  2. 返回类型为指针或引用的特殊要求
    • 当返回类型为指针或引用时,子类重写的虚函数返回类型可以是父类虚函数返回类型的指针或引用的派生类类型。这被称为协变返回类型。例如:
    class ParentClass {};
    class ChildClass : public ParentClass {};
    class Base {
    public:
        virtual ParentClass* func() = 0;
    };
    class Derived : public Base {
    public:
        ChildClass* func() override {
            return new ChildClass();
        }
    };
    
    在上述代码中,Base::func返回ParentClass*,而Derived::func返回ChildClass*ChildClassParentClass的派生类,这种情况是允许的。同理,返回引用时也遵循此规则,例如父类返回ParentClass&,子类可以返回ChildClass&