为了说明这个问题,我们先从一个简单的例子:在linux下用gcc编译后,打印的结果为0。可能有些同学会有疑问,运行结果怎么不是1呢?这里要说一下,虚函数是动态绑定的,即在运行时来确定;而默认构造参数,是在编译时就确定了,如果默认构造参数也需要在运行时确定,编译器就需要实现复杂的机制来实现,运行效率必然大打折扣,因此默认构造参数就在编译时就确定了。...
网上面试题中有一道以前没有想过,也没有试过的题。就是在继承关系中,
虚函数
中如果有
默认
参数
,实际过程中,
默认
参数
是多少。
试验代码如下:
#include <iostream>
using namespace std;
class A {
public:
virtual void foo (int i = 1) {
cout << "foo in class A...
《Effective
C++
改善程序与设计的55个具体做法》条款37写道:绝不重新定义继承而来的缺省
参数
值。静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。
动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。
有时候,基类中的
虚函数
是为了派生类中的使用而声明定义的。此类函数我们叫做
纯虚函数
,不需要写成空函数的形式,一般只需要声明成:
virtual 函数类型 函数名(形参表列)=0;
最后面的“=0“并不代表函数返回值为0,只是形式上的作用,告诉编译系统”这是
纯虚函数
”;
这是一个声明语句,最后应有分号。
但是,不代表此函数不能定义,下面转载的文章说明了对
纯虚函数
定义和调用的方式
看代码时时无意看到代码里某类的
纯虚函数
居然有实现,吓我一跳,果真学无止境啊!
在此转载
相关
文...
虚函数
可以有
默认
实参,但是,即便派生类有自己的
默认
实参,在使用使用基类指针调用时还是会
使用基类的
默认
实参。反之,如果使用派生类指针调用,则会使用派生类的
默认
实参(当然这就不
设计多态了,因为调用指针/引用是派生类,而不是基类)。
class A{
public:
A()=default;
virtual ~A()=default;
public:
virtual void func(int i = 10){
printf("A = %d\n",i);
class B :p
当缺省
参数
和
虚函数
一起出现的时候到底用哪个
默认
值呢?
虚函数
是动态绑定的,但是为了执行效率,缺省
参数
是静态绑定的。
也就是 指针是哪种类型,就调用该类型对应的类中,该函数定义时的缺省值。
#include
using namespace std;
class A
public:
一般形式:virtual 函数类型 函数名(
参数
列表)=0;
纯虚函数
与抽象类
在定义一个表达抽象概念的基类时,有时可能会无法给出某些成员函数的具体实现。这时,就可以将这些函数声明为
纯虚函数
。
纯需函数的声明格式如下:
virtual 类型 函数名(
参数
表)=0;
在帮新同事进行代码审查的时候,常常会发现这样的
问题
:代码中原有基类B和派生类D1,现在新加一个派生类D2,它有一个函数f2()。由于经验不足,新同事并没有注意到D1也有类似的函数f1()。于是造成了类似的代码出现在了两个地方,代码冗余造成将来的维护工作异常困难。注意到f()实际上是一个通用的行为,我们可以把它抽出来放到基类中,如下所示。
class B
public:
virtual
提到
虚函数
,我们就会自然而然的想到多态,但是当
虚函数
中存有
默认
参数
值的时候,在派生类中重定义这个
虚函数
时不可以改变这个
参数
的值。
请看下面的例子:
#include "stdafx.h"
#include
using namespace std;
class Base
public:
Base()
std::cout << "Base Constructor" << std: