纯虚函数也可定义!

今天,我读到《effective c++》的第34条款,里面竟然提到纯虚函数也是可以定义的,大吃一惊,赶快打开vs2005,自己编写了一段代码,编译运行,发现竟然真的可以!

俺的代码:

 

运行结果:

I'am pureVirtualFunc
I belong to B!请按任意键继续. . .

 

原来抽象类是可以对纯虚函数进行定义的,在其子类中也是可以使用抽象父类的缺省实现!这一切对我来说显得这么突然!好像腿脚一软,站不稳了!是的,以前天天啃个不停个的教材竟然存在如此偏差!等等!好像教材里也没错!里面并没有说“不能”进行函数实现,而是根本就没有提到要去实现。所以老师和天真的我们都默认为不能实现咯!

在此我深深感悟到,目光短浅和学无止境的真正含义了!

在 C++ 中,纯虚函数(Pure Virtual Function)通常用于定义接口,并且在大多数情况下是不提供具体实现的。然而,C++ 并没有完全禁止为纯虚函数提供定义。实际上,**纯虚函数是可以有定义的**,尽管它通常只声明而不实现。 ### 纯虚函数允许有定义的情况 虽然纯虚函数的主要目的是作为接口规范,要求派生类必须重写该函数,但 C++ 允许在基类中为纯虚函数提供实现。这种实现可以被派生类调用,例如通过显式使用作用域解析运算符 `Base::func()` 来调用基类的实现。 一个典型的例子是析构函数:如果一个类包含纯虚函数,那么它的析构函数应该也是虚函数,并且通常需要提供定义(即使它是纯虚函数)。这是因为对象销毁时会调用析构函数,而析构函数的行为不能留空[^3]。 ```cpp #include <iostream> using namespace std; class Base { public: virtual void foo() = 0; // 纯虚函数 virtual ~Base() = 0; // 纯虚析构函数 }; void Base::foo() { cout << "Base::foo implementation" << endl; } Base::~Base() { cout << "Base destructor called" << endl; } class Derived : public Base { public: void foo() override { Base::foo(); // 调用基类纯虚函数的实现 } ~Derived() {} }; ``` 在这个示例中,`Base::foo()` 是一个纯虚函数,但它具有定义。`Derived` 类在重写 `foo()` 时可以选择性地调用基类的实现[^1]。 ### 纯虚函数定义的用途 - **提供默认实现**:当基类无法提供完整的功能,但仍希望提供一些通用逻辑时,可以为纯虚函数提供实现。 - **辅助派生类实现**:派生类可以在自己的实现中调用基类的纯虚函数定义,以复用部分代码。 - **强制接口一致性**:即使提供了定义纯虚函数仍然要求派生类显式地覆盖该函数,确保了接口的一致性和可扩展性[^2]。 ### 注意事项 - 带有纯虚函数的类仍然是抽象类,不能直接实例化。 - 纯虚函数定义通常应与声明分离,即在头文件中声明,在源文件中定义。 - 如果派生类没有重写某个纯虚函数,则它也会成为一个抽象类[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值