c++不可以用指针直接调用基类的虚函数吗?

来源:百度知道 编辑:UC知道 时间:2024/05/18 06:17:27
在此谢过。
看看下面有bug的程序:
#include <iostream>
using namespace std;
class a
{
public:
virtual void fn1(int k)
{
cout<<"base"<<k<<endl;
}
};
class b:public a
{
public:
void fn1(int t)
{
cout<<"derived"<<t<<endl;
}
};
int main()
{
a *bbb,bb;
b ddd;
/*cout<<"*bbb"<<endl;
bbb->fn1(2);*/
//上面是错的。疑问:不可以用指针调用虚函数吗
cout<<"bb"<<endl;
bb.fn1(8);
bbb = &ddd;
cout<<"&ddd"<<endl;
bbb->fn1(4);
cout<<"ddd"<<endl;
ddd.fn1(5);

int k;
cin>>k;
return 0;
}

比如A是基类 B是子类 f()是虚函数 b是B的实例 要调用A的f只要b->A::f()就可以了

这种写法会不通过虚函数表直接使用A::f()的地址。

----

||| 搞错你的意思了...

你没给bbb赋值当然不能用了... bbb = &ddd;

*bbb没有实例化,可以:
bbb = new a;
//or
bbb = new b;
//or
bbb = & bb;

可以的,但是你这样的用法不对,a *bbb只是声明了一个类型为a的指针,它没有所指的空间,如果之间调用bbb->fn1(2),会提示你没有初始化,这么用实际是没有意义的。可以这样:a *bbb=new a,然后就可以了。
还有你cout<<"*bbb"<<endl;是想干吗,貌似没什么意义。