C++虚函数探讨(一)

2014-11-24 12:36:35 · 作者: · 浏览: 0

环境:2010

代码:

#include

using namespace std;

class A

{

public:

A() {

a = 0;

cout<<"A::A()"<

}

int a;

};

class B:protected A

{

public:

B() {

i=1;

cout<<"B::B()"<

}

public:

int i;

};

int main(void){

B b2;

b2.i = 20;

A *pp = (A*)&b2;

cout<<"pp->a: "<a<<" "<<"b2.i "<

return 0;

}

void SetB(int n){

this->a = n;

}

class B{

public:

virtual void Show(){cout<<'B'<

};

class D:public B{

public:

void Show(){cout<<'D'<

};

void fun1(B* ptr){ptr->Show();}

void fun2(B& ref){ref.Show();}

void fun3(B b){b.Show();}

int main(void){

B b,*p=new D;

D d;

fun1(p);

fun2(b);

fun3(d);

return 0;

}

读者可以思考一下输出结果。

现在来看输出结果:

分析:主函数里基类类型的指针指向派生类,fun1()里传的是指向派生类的指针,又因为函数show是虚函数,所以这里应该调用的是派生类的show方法。fun2()传的是基类的对象,fun2()里是对对象的引用,所以这里应该调用的是基类的show方法。fun3()里传的是对象,即使传的是对象D,但因为fun()里是B对象,初始化时使用的是B类的复制构造函数。由于复制构造函数接收的是B类型的常引用,d又符合类型兼容规则,所以可以作为参数传给它。由于执行的是B的复制构造函数,只要B类型的成员会被复制,d类的不会复制,也没有空间存储,所以生成的是对象是基类的B对象,进而输出的是'B'。

总结:基类的指针可以指向派生类的对象,基类的引用可以作为派生类的别名,但基类的对象不能表示派生类的对象

摘自 Wentasy