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

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

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


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

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


可以

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

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


可以,但是有限制条件!

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

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

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

【热门文章】
【热门文章】