c++ 父类方法中调用父类声明的纯虚函数,可以这样做吗?
业精于勤,荒于嬉;行成于思,毁于随。
可以. 经典的应用场景为 template method pattern.http://sourcemaking.com/design_patterns/template_method/cpp/1
template method pattern
可以
#include <iostream> class Base { public: void func() { virtualFunc(); } virtual void virtualFunc() = 0; }; class Derived : public Base { public: void virtualFunc() { std::cout << "xxx" << std::endl; } }; int main() { Derived d; d.func(); }
c++并没有说你不可以这样做,上面的回答已经告诉你答案了。
我这里想说的是,你想通过这样的设计达到什么样的目的。 1. 你的纯虚函数都是public的 个人认为,如果是这样情况,需要再仔细考虑一下,是不是必须这样做。是不是还有其他可替代方案,比如,在这个类的外部对这些功能进行整合。一个类的设计,它的public方法应该尽量设计成正交的才对(KISS)。如果你的新接口都是由public成员构成,你需要考虑一些后期维护问题,还有是不是方便对其做单元测试。 2. 你的纯虚函数不都是public的 我想你有足够的理由来创建这个新接口,但是还请尽量保持你接口功能的正交性。
可以,但是有限制条件!
class A { public: virtual void print() { cout << "virtual function" << endl; } static void static_func() { print(); } };
你只能在非static成员方法中调用,因为虚函数的调用依赖于对象(和普通成员方法一样),在static成员方法中,并没有隐式传入this指针,也就是说上面的代码是错误的,错误信息如下所示:
其实从另一个角度看的话,也是不行的,即使这段代码编译通过,但是static方法的调用是可以只通过类型名就可以的,那么此时该如何调用虚函数呢?虚函数的实现机制就是在对象头存储着一个虚表指针,你连对象都没有,该如何在运行的时候调用该虚函数呢?
可以. 经典的应用场景为
template method pattern
.http://sourcemaking.com/design_patterns/template_method/cpp/1
可以
c++并没有说你不可以这样做,上面的回答已经告诉你答案了。
我这里想说的是,你想通过这样的设计达到什么样的目的。
1. 你的纯虚函数都是public的
个人认为,如果是这样情况,需要再仔细考虑一下,是不是必须这样做。是不是还有其他可替代方案,比如,在这个类的外部对这些功能进行整合。一个类的设计,它的public方法应该尽量设计成正交的才对(KISS)。如果你的新接口都是由public成员构成,你需要考虑一些后期维护问题,还有是不是方便对其做单元测试。
2. 你的纯虚函数不都是public的
我想你有足够的理由来创建这个新接口,但是还请尽量保持你接口功能的正交性。
可以,但是有限制条件!
你只能在非static成员方法中调用,因为虚函数的调用依赖于对象(和普通成员方法一样),在static成员方法中,并没有隐式传入this指针,也就是说上面的代码是错误的,错误信息如下所示:
其实从另一个角度看的话,也是不行的,即使这段代码编译通过,但是static方法的调用是可以只通过类型名就可以的,那么此时该如何调用虚函数呢?虚函数的实现机制就是在对象头存储着一个虚表指针,你连对象都没有,该如何在运行的时候调用该虚函数呢?