在牛客网上的C++面筋题。
virtual
声明,父类可以引用子类对象,子类成员函数可以重写父类方法(函数)。虚函数的核心理念就是通过基类访问派生类定义的函数。
=0
。如上所示:
【纯虚函数的实现原理】
纯虚函数也一定是某个类的成员函数,含有纯虚函数的类叫做抽象类。在C++中,抽象类无法实例化对象。如果我们定义了Shape
这样的类,那么,Shape
类当中,因为有虚函数和纯虚函数,所以它一定有一个虚函数表,也就一定有一个虚函数表指针。在虚函数表当中,如果是纯虚函数,那么虚函数表中的函数指针值为0;如果是普通的虚函数,那就肯定是一个有意义的值。
一个虚函数的最简单的栗子:
#include <iostream> using namespace std; class A{ public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! system("pause"); return 0; }
不能。。C++在编译期间,就能确定你要创建的对象的具体类型,而这个具体类型包含了什么,继承了什么在编译期间也是明确的,即构建一个对象,必须知道具体的类型信息,构造什么也都是明确的,根本没必要存在虚构造函数。虚函数的存在是因为编译期间没法确定具体调用对象,才会有虚函数,虚函数表这么个东西。
解决方案:Bjarne建议用factory pattern,也就是为每一个要构建的类型再创建一个对应的factory,把问题放到factory的make方法中去解决。这也是C++中的通用解决方案。
[1] https://www.zhihu.com/question/35632207