怪我咯2017-04-17 11:42:05
可以. 经典的应用场景为 template method pattern
.
http://sourcemaking.com/design_patterns/template_method/cpp/1
大家讲道理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();
}
ringa_lee2017-04-17 11:42:05
c++并没有说你不可以这样做,上面的回答已经告诉你答案了。
我这里想说的是,你想通过这样的设计达到什么样的目的。
1. 你的纯虚函数都是public的
个人认为,如果是这样情况,需要再仔细考虑一下,是不是必须这样做。是不是还有其他可替代方案,比如,在这个类的外部对这些功能进行整合。一个类的设计,它的public方法应该尽量设计成正交的才对(KISS)。如果你的新接口都是由public成员构成,你需要考虑一些后期维护问题,还有是不是方便对其做单元测试。
2. 你的纯虚函数不都是public的
我想你有足够的理由来创建这个新接口,但是还请尽量保持你接口功能的正交性。
黄舟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方法的调用是可以只通过类型名就可以的,那么此时该如何调用虚函数呢?虚函数的实现机制就是在对象头存储着一个虚表指针,你连对象都没有,该如何在运行的时候调用该虚函数呢?