面试题答案
一键面试- 函数签名规则
- 参数列表:子类重写的虚函数参数列表必须与父类中被重写的虚函数参数列表完全相同。包括参数的个数、类型及顺序都要一致。例如:
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
返回void
,Child::func
也必须返回void
。
- 返回类型为指针或引用的特殊要求
- 当返回类型为指针或引用时,子类重写的虚函数返回类型可以是父类虚函数返回类型的指针或引用的派生类类型。这被称为协变返回类型。例如:
在上述代码中,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*
,ChildClass
是ParentClass
的派生类,这种情况是允许的。同理,返回引用时也遵循此规则,例如父类返回ParentClass&
,子类可以返回ChildClass&
。