子类继承父类,重写纯虚函数和虚函数时注意

        今天遇到这么个问题,程序中定义了一个借口类,成员函数全是纯虚函数,我写的子类继承了这个接口类,但是报错提示说:无法实例化抽象类!

原因是这样的:子类继承父类时,必须重写父类的纯虚函数,函数名、返回类型、参数个数和类型都不能改。若父类中的虚函数自己有定义,子类也可以不重写。

测试如下:

头文件test.h

#pragma once
#include "iostream"
using namespace std;

class FATHER
{
public:
	virtual void print(int a)=0;  //纯虚函数,子类需重写。
	//virtual void print(int a);
};

class CHILD : public FATHER
{
public:
    int print(double d);
};


在头文件里我定义了一个父类和子类,其中父类的成员函数print是纯虚函数,子类定义的print函数和父类在返回值和参数类型不一样。再看看下面的测试代码,实例化了一个子类,并调用了其成员函数,可以编译成功吗?


可以看到报错了:纯虚函数没有定义!

将子类的print函数的返回值和参数类型保持和父类一致就可以编译通过了。


当父类的成员函数式虚函数时,即父类对虚函数有定义时,子类可以进行重载,不需要完全和父类的虚函数保持一致,如下:

#pragma once
#include "iostream"
using namespace std;

class FATHER
{
public:
	//virtual void print(int a)=0;  //纯虚函数,子类需重写。
    virtual void print(int a);
};

class CHILD : public FATHER
{
public:
    int print(double d);   //子类无需和父类的虚函数保持一致,当然子类也可以不继承虚函数。
};

编译通过,如下:






  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
父类是虚类的情况下,当父类中的函数a调用了父类虚函数,并且在子类重写了这个虚函数,如果父类指针指向子类对象,调用函数a可能会引发异常,出现访问权限冲突的情况。 这是因为在C++中,虚函数的调用是通过虚函数表来实现的。当父类指针指向子类对象,调用函数a会先在父类虚函数表中查找对应的虚函数,然后调用该虚函数。但是由于子类重写父类虚函数子类虚函数表中的对应位置存储的是子类虚函数地址。因此,当父类指针指向子类对象,调用函数a会去父类虚函数表中查找虚函数地址,但实际上调用的是子类虚函数。 这样就会导致访问权限冲突的问题。因为父类中的函数a可能依赖于父类虚函数的实现,而子类重写了这个虚函数,可能会改变虚函数的行为,导致函数a的逻辑出现问题。 为了避免这种访问权限冲突的问题,可以在父类中将虚函数声明为纯虚函数,即在函数声明后面加上`= 0`。这样父类就成为了抽象类,不能直接实例化对象,只能作为基类被继承子类必须实现纯虚函数,否则子类也会成为抽象类。 示例代码如下所示: ```cpp class Base { public: virtual void func() = 0; // 纯虚函数 }; class Derived : public Base { public: void func() override { // 子类实现纯虚函数 // 具体的实现逻辑 } }; int main() { Base* ptr = new Derived(); // 父类指针指向子类对象 ptr->func(); // 调用虚函数 delete ptr; return 0; } ``` 这样,父类指针指向子类对象,调用函数a就不会出现访问权限冲突的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值