首页  >  问答  >  正文

c++ 父类方法中调用父类声明的纯虚函数?

c++ 父类方法中调用父类声明的纯虚函数,可以这样做吗?

迷茫迷茫2765 天前630

全部回复(4)我来回复

  • 怪我咯

    怪我咯2017-04-17 11:42:05

    可以. 经典的应用场景为 template method pattern.
    http://sourcemaking.com/design_patterns/template_method/cpp/1

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:42:05

    可以

    #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();
    }
    

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 11:42:05

    c++并没有说你不可以这样做,上面的回答已经告诉你答案了。

    我这里想说的是,你想通过这样的设计达到什么样的目的。
    1. 你的纯虚函数都是public的
    个人认为,如果是这样情况,需要再仔细考虑一下,是不是必须这样做。是不是还有其他可替代方案,比如,在这个类的外部对这些功能进行整合。一个类的设计,它的public方法应该尽量设计成正交的才对(KISS)。如果你的新接口都是由public成员构成,你需要考虑一些后期维护问题,还有是不是方便对其做单元测试。
    2. 你的纯虚函数不都是public的
    我想你有足够的理由来创建这个新接口,但是还请尽量保持你接口功能的正交性。

    回复
    0
  • 黄舟

    黄舟2017-04-17 11:42:05

    可以,但是有限制条件!

    class A
    {
        public:
        virtual void print() 
        {
            cout << "virtual function" << endl;
        }
        static void static_func() 
        {
            print();
        }
    };

    你只能在非static成员方法中调用,因为虚函数的调用依赖于对象(和普通成员方法一样),在static成员方法中,并没有隐式传入this指针,也就是说上面的代码是错误的,错误信息如下所示:

    其实从另一个角度看的话,也是不行的,即使这段代码编译通过,但是static方法的调用是可以只通过类型名就可以的,那么此时该如何调用虚函数呢?虚函数的实现机制就是在对象头存储着一个虚表指针,你连对象都没有,该如何在运行的时候调用该虚函数呢?

    回复
    0
  • 取消回复