c++中关于继承的基础问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 00:00:23
class A {
public:
void fun() {
cout << "A::fun" << endl;
}

};
class B : public A {
public:
void fun() {
cout << "B::fun" << endl;
}
void fun0() {
cout << "B::fun0" << endl;
}
};
int main() {
A *a=new A;
B *b=new B;
A *pa;
B *pb;
pb=static_cast<B *>(a); //基类指针向继承类指针进行显示转化
pb->fun0();
pb->fun();
return 0;
}

class A{
public:
virtual void f(){cout << "A::f" << endl;};
};

class B:public A{
public:
virtual void f(){cout << "B::f" << endl;};
};
class C:public A{
public:
virtual void f(){cout << "C::f" << endl;};
};
void test(A *a){
a->f();
};
int main(int argc, char* argv[])

就是一个虚函数的问题啊
第一个程序输出B::fun B::fun0
第二个程序输入b 则输出B::f 输入c则输出C::f
在继承的时候,如果不是虚函数,则采用早绑定,函数体与函数调用在程序运行之前就绑定了.当函数声明为虚函数时,,编译器通过创建一个虚函数表存放虚函数的地址,在运行时,通过基类指针做虚函数调用时,编译器静态的插入能取得这个虚函数指针并在虚函数表中找到正确的函数版本.

第一个的结果:
B::fun0
B::fun
Press any key to continue

第二个的结果是:
输入b运行B的函数fun
输入c运行C的函数fun
第二个是比较好的方法
用的是虚函数的方法
在子类中重新定义基类中的函数
其实也可以用纯虚函数
virtual void f()=0;
不必在基类中定义fun()