现在的位置: 首页 > 综合 > 正文

virtual 的问题

2013年09月24日 ⁄ 综合 ⁄ 共 893字 ⁄ 字号 评论关闭
在看一个系统的源码时,发现有些类的纯虚函数中有缺省值,但不知道如何使用这些缺省值?在继承类中能使用吗?但下面的例子在编译的时候通不过:
#include <stdio.h>;
#include <iostream>;
#include <stdlib.h>;

using namespace std;

class A
{
public:
    virtual void func(int a, int b = 0) = 0;
};

class B: public A
{
public:
    void func(int a, int b)
    {
        cout << "a = " << a << "    b = " << b << endl;
    }
};

int main()
{
    B b;
    b.func(10);
}
编译时报错如下:The wrong number of arguments have been specified for "B::func(int, int)".

这里出错的原因是你没有搞清楚虚函数之动态绑定机制和缺省参数在继承中的意义.
1>;什么是动态类型与静态类型?
比如你这里A *pa = new B;这里的pa的静态类型就是A *而它的动态类型呢就是B,而B *pb=new B;它的动态与静态类型都是B *.但你这里用的是B b;b的型别是B,静态与动态类型都是B,虚函数是用来干什么的?是用来动态绑定的呀,而动态绑定是需要通过指针或引用实现的呀,你直接用类对象能实现动 态绑定吗?所以你这里根本不会根据基类A的成员函数来动态绑定来调用B的相应成员函数,所以缺省参数就没有.

2>;缺省参数是个静态绑定的而非动态.即如有:
A *pa = new B;
那么pa->;fun(..);此时pa的静态类型为A *,它有缺省参数值,所以如果你把
void B:: func(int a, int b) 改成void B::func(int a, int b=7) 后它用的默认参数值还是A中定义的.虽然实际上调用的是B的成员函数.但并没有用B的成员函数中参数的默认值.所以注意一点就是不要在继承中改变默认参数 值的定义.

居于以上两点你的程序可以改为如下:main部分:

int main()
{
    B b;
    A &rb=b;
  rb.func(10);
}

 

抱歉!评论已关闭.