forward1010的个人空间 https://blog.eetop.cn/493893 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

已有 1905 次阅读| 2009-11-2 00:24

 

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

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;
}

这次顺利编译通过。

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


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 6

    评论
  • 339

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-18 17:31 , Processed in 0.029576 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部