h_virus 发表于 2016-05-10 14:39

问大家一个虚函数的问题啊

class PurvitualBase1{
public:
        virtual PurvitualBase1* new_expr(){return new PurvitualBase1();};
        virtual PurvitualBase1* clone(){return new PurvitualBase1(*this);};
private:
        int b;
};

classPurvitualDeriv1: publicPurvitualBase1{
public:
        virtual PurvitualDeriv1* new_expr(){return new PurvitualDeriv1();};
        virtual PurvitualDeriv1* clone(){return new PurvitualDeriv1(*this);};
private:
        int bb;
};

void user2(PurvitualBase1 *pb, PurvitualDeriv1 *pd)
{
        PurvitualDeriv1 *pd2 = pd->clone();
        PurvitualDeriv1 *pd3 = pb->clone();
        pd2->output();
        pd3->output();
}


PurvitualDeriv1 testv1;
PurvitualBase1 *ptestpb1 = &testv1;
user2(ptestpb1, &testv1); //为什么这个函数调用时,user2中的虚函数clone没有用子类的clone,却用了父类的clone呢?按理说应该是虚函数调用子类的啊

h_virus 发表于 2016-05-10 14:41

我是说ptestpb1指向了子类,user2中的pb->clone() 应该是调用PurvitualDeriv1类的clone函数啊,怎么还是调用父类的呢

bule_gay_是条狗 发表于 2016-05-10 15:11

我靠,楼主这代码能不能分个行先?这代码起码我是不愿意看。

bruceteen 发表于 2016-05-10 16:29

首先,应当贴出不含垃圾且完整的代码#include <iostream>

struct base
{
    virtual base* test()
    {
      std::clog << "base::test()\n";
      return this;
    }
};

struct derive : base
{
    virtual derive* test()
    {
      std::clog << "derive::test()\n";
      return this;
    }
};

int main( void )
{
    derive d;
    base* p1 = &d;
    base* p2 = p1->test();
    //derive* p3 = p1->test();

    return 0;
}输出是:derive::test()
可见,调用的是派生类的test函数
但为什么 derive* p3 = p1->test(); 编译失败呢?这是因为 p1->test() 的类型是编译期确定的,不可能推延到运行时才确定它的类型。
对于如下函数
void foo( base *pb )
{
    derive *pd = pb->test();
}
编译期怎么确保你传进来的一定是derive对象的地址?如果是一个base对象的地址怎么办?
页: [1]
查看完整版本: 问大家一个虚函数的问题啊