Viscual C++编程深入引导书中有一段说:在成员函数中可能调用纯虚函数,但在构造函数或析构函数内调用一个纯虚函数将导致程序运行错误,因为没有为纯函数定义代码?但我做过试验,在构造函数中调用没有出任何问题?

解决方案 »

  1.   

    楼上的说得不错。虚函数是使用vtable进行间接调用的,编译器一般会在构造函数中间自动生成代码初始化这个vtable表中间的函数指针指向类对象需要的正确的类的函数。纯虚函数在抽象父类中间是没有定义的,是一个空项。所以如果抽象基类的构造函数中间调用了这个纯虚函数(本来应该由具体子类来实现的),而此时子类的vtable表还没有由子类的构造函数初始化,鬼才知道调用些什么东西。必死!!!
      

  2.   


    实际上在VC上这样做不是运行出错,而是压根就编译通不过。VC会在link的时候告诉你unresolved external symbol
      

  3.   

    tony1978(突击召唤师) 不对,在子类被构造时先构造父类。
    若在父类构造函数或析构造函数中调用虚函数时。虚函数不起作用,不起虚的作用。但仍可调用,当作普通函数成员一样调用。下面的就是证明:#include<iostream.h>
    class base
    {
    private:
    int age;
    int sex;
    public:
    base(int iage,int isex)
    {
    age=iage;
    isex=isex;
    cout<<"\ncalled the virtual function at the base class constructor"<<"\n"<<getage();
    }
    virtual int getage()=0
    {
    return age;
    }
    ~base()
    {
    cout<<"\ncalled the virtual function at the base class destroyer"<<"\n"<<getage();
    }
    void dd()
    {cout<<"call the virtual getage() at the base class"<<getage();}
    };class assc:public base
    {
    private:
    int age;
    int sex;
    public:
    assc(int aage=0,int asex=0,int bage=100,int bsex=100):base(bage,bsex)
    {
    age=aage;
    sex=asex;
    }
    int getage()
    {
    return age;
    }};
    main()
    {
      assc a;
    }运行结果:called the virtual function at the base class constructor
    100
    called the virtual function at the base class destroyer
    100
    Press any key to continue但在子类中调用是则也可能调用的是父类的
      

  4.   

    这个与vptr和vtbl有关了
    class B
    {
    B();virtual void pvf()=0;};
    一般点:
    void B::pvf(){...}class D
    {
    D();
    void pvf();
    };void D::pvf()
    {...}
    如果在B::B(){pvf();}
    那么在编译时vptr设置为vptr的操作会在programer的任何操作前 这个时候vptr为B::vtbl你说这个时候可以吗??
      

  5.   

    我的天,
    virtual int getage()=0
    {
    return age;
    }能叫纯虚函数吗??class CFather  
    {
    public:
    CFather();
    virtual ~CFather(); virtual void GetName() = 0};CFather::CFather()
    {
    GetName();
    }CFather::~CFather()
    {

    }
    class CSon : public CFather  
    {
    public:
    CSon();
    virtual ~CSon(); virtual void GetName() {};};CSon::CSon()
    {
    GetName();
    }CSon::~CSon()
    {}
    楼主需要先复习一下什么叫纯虚函数。
      

  6.   

    我上面这个CFather和CSon的例子是纯虚函数在父类构造函数调用的例子,编译是通不过的。理由见我上面的回帖。
      

  7.   

    回复人: wwwsq(wwwsq) ( ) 信誉:100  你说的对!
    谢谢提醒!