关于类继承问题
class A
{
public:
virtual void aa()=0;
};
class a: public A
{
public:
void aa(){};
};
class B:public A
{
public:
virtual void bb()=0;
};
class b: public a,public B
{
public:
void bb(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
b bb;
bb.aa();
}
error C2259: “b” : 不能实例化抽象类
请问这种问题怎样解决
问题点数:20、回复次数:4Top
1 楼oldjackyone(老兔子)(她妈妈说:以为你真的很帅么???)回复于 2004-08-01 09:49:30 得分 8
#include <iostream>
using namespace std;
class A
{
public:
virtual void aa()=0;
};
class a: public A
{
public:
void aa(){};
};
class B:public A
{
public:
void aa(){}//虚函数需要在派生类中定义它的函数体。
virtual void bb()=0;
};
class b: public a,public B
{
public:
void bb(){};
};
int main()
{
return 0;
b bb;
bb.A::aa(); //如果是bb.aa()会出现二义性,因为不知道是调用a类还是B类中的aa()
}
Top
2 楼UPCC(杂食动物)回复于 2004-08-01 10:06:30 得分 10
class A
{
public:
virtual void aa()=0;
};
class a: public A
{
public:
void aa(){};
};
class B:public A
{
public:
void aa(){cout<<"test"<<endl;}
//上面纯虚函数没有定义类就是抽象类就不可以实例化。
virtual void bb()=0;
};
class b: public a,public B
{
public:
void aa(){a::aa();}
//必须指明调用那个aa函数,不然编译器怎么编译的?
void bb(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0; //这一句应该放在最后,你在这里就退出栈了,以后的怎么运行?
b bb;
bb.aa();
}Top
3 楼leonchew(安静(静哥哥,找寻黄蓉中...))回复于 2004-08-01 10:13:09 得分 2
同楼上,要在派生类中写虚函数体.a类的 void aa() ,B 类的void aa()和 b 类的void bb{}最好都写.调用时,同时要显示说明.bb.A::aa(); 如这种形式.Top
4 楼Rossonero(奴家只求大官人快些)回复于 2004-08-01 17:56:43 得分 0
因为在多重继承的过程中,编译器发现有多个相同的成员函数,不知道调用的是哪个,产生了2义性.改成虚拟继承即可.
class A
{
public:
virtual void aa()=0;
};
class a: virtual public A //让a和B都是虚拟继承
{
public:
void aa(){};
};
class B:virtual public A
{
public:
virtual void bb()=0;
};
class b: public a,public B
{
public:
void bb(){};
};
int main(int argc, char * argv[])
{
b bb;
bb.aa();
return 0;
}Top




