问大家一个虚函数的问题啊
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呢?按理说应该是虚函数调用子类的啊 我是说ptestpb1指向了子类,user2中的pb->clone() 应该是调用PurvitualDeriv1类的clone函数啊,怎么还是调用父类的呢 我靠,楼主这代码能不能分个行先?这代码起码我是不愿意看。 首先,应当贴出不含垃圾且完整的代码#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]