织梦CMS - 轻松建站从此开始!

罗索

一个关于继承和虚函数的问题

罗索客 发布于 2008-07-28 10:18 点击:次 
在C++语言中,拥有纯虚函数的类成为抽象类,该类不能实例化一个对象,必须在进一步继承中实现该函数,然后用派生类定义对象。那么,现在的问题是,基类为非抽象类,从他继承来的类是不是非抽象类呢?如果该继承类有纯虚函数,又属于抽象类还是非抽象类呢?
TAG:

标签:virtual

首先,看一下这几行简单的代码:

class A
{
int a;
public:
A(int aa):a(aa){};
void funa(){ a++;};
};

class B:public A
{
int b;
public:
B(int aa,int bb):A(aa),b(bb){};
virtual void funb()=0;//pure virtual function
};

class C
{
int c;
public:
C(int cc):c(cc){};
virtual void func()=0;
};

A a(1);//应该正确
C c(1);//应该错误
B b(1,2);//对不对呢?

在C++语言中,拥有纯虚函数的类成为抽象类,该类不能实例化一个对象,必须在进一步继承中实现该函数,然后用派生类定义对象。那么,现在的问题是,基类为非抽象类,从他继承来的类是不是非抽象类呢?如果该继承类有纯虚函数,又属于抽象类还是非抽象类呢?还是先测试一下上面代码,看看结果:

第一次测试:(使用VC++6.0)

int main(int argc, char* argv[])
{
A a(1);
C c(1);
B b(1,2);
}

看看结果:

F:\\work2000\\ddd\\ddd.cpp(29) : error C2259: 'C' : cannot instantiate abstract class due to following members:
F:\\work2000\\ddd\\ddd.cpp(20) : see declaration of 'C'
F:\\work2000\\ddd\\ddd.cpp(29) : warning C4259: 'void __thiscall C::func(void)' : pure virtual function was not defined
F:\\work2000\\ddd\\ddd.cpp(24) : see declaration of 'func'
F:\\work2000\\ddd\\ddd.cpp(29) : error C2259: 'C' : cannot instantiate abstract class due to following members:
F:\\work2000\\ddd\\ddd.cpp(20) : see declaration of 'C'
F:\\work2000\\ddd\\ddd.cpp(29) : warning C4259: 'void __thiscall C::func(void)' : pure virtual function was not defined
F:\\work2000\\ddd\\ddd.cpp(24) : see declaration of 'func'
F:\\work2000\\ddd\\ddd.cpp(30) : error C2259: 'B' : cannot instantiate abstract class due to following members:
F:\\work2000\\ddd\\ddd.cpp(12) : see declaration of 'B'
F:\\work2000\\ddd\\ddd.cpp(30) : warning C4259: 'void __thiscall B::funb(void)' : pure virtual function was not defined
F:\\work2000\\ddd\\ddd.cpp(17) : see declaration of 'funb'
F:\\work2000\\ddd\\ddd.cpp(30) : error C2259: 'B' : cannot instantiate abstract class due to following members:
F:\\work2000\\ddd\\ddd.cpp(12) : see declaration of 'B'
F:\\work2000\\ddd\\ddd.cpp(30) : warning C4259: 'void __thiscall B::funb(void)' : pure virtual function was not defined
F:\\work2000\\ddd\\ddd.cpp(17) : see declaration of 'funb'
Error executing cl.exe.
定义抽象类C 的对象肯定是错的,去掉C对象的定义,而编译结果也显示了B为抽象类。

再用D继承B,使其成为非抽象类

class D:public B
{
int d;
public:
D(int dd,int bb,int aa):B(bb,aa),d(dd){};
void fund(){d++;};
void dunb(){d--;};
};

int main(int argc, char* argv[])
{
A a(1);
//C c(1);
// B b(1,2);

D d(1,2,3);

return 0;
}

这次顺利编译通过。

所以得出的结论是:继承于非抽象类的子类,也可以通过在其内部声明纯虚函数而成为抽象类。

呵呵,关于我又想到了好几个问题,我在总结一下,下次写出问题和测试结果。

(ixmy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200807/7089.html]
本文出处:网络博客 作者:ixmy
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容