在子类函数中加与不加virtual有什么区别?

lagest 2002-12-19 11:24:45
class a{
public:
virtual void print(){cout<<"Class A"<<endl;}
};

class b:public a{
public:
void print(){cout<<"Class B"<<endl;}//该处加与不加virtual好象运行结果一样
};

class c:public a{
pbulic:
void print(){cout<<"Class C"<<endl;}//该处加与不加virtual好象运行结果一样
};

a * pa;

pa = new a;
pa->print();
delete pa;

pa = new b;
pa->print();
delete pa;

pa = new c;
pa->print();
delete pa;
...全文
389 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lagest 2002-12-19
  • 打赏
  • 举报
回复
hehe谢谢->一线天
rushman 2002-12-19
  • 打赏
  • 举报
回复
例子:
class a{
public:
virtual void print(){cout<<"Class A"<<endl;}
void p2(){cout<<"A-p2"<<endl;}
};

class b:public a{
public:
void print(){cout<<"Class B"<<endl;}
virtual void p2(){cout<<"B-p2"<<endl;}
};

class c:public b{
pbulic:
void print(){cout<<"Class C"<<endl;}
void p2(){cout<<"C-p2"<<endl;}
};

a * pa;

pa = new a;
pa->print();
pa->p2();
delete pa;

pa = new b;
pa->print();
pa->p2();
delete pa;

pa = new c;
pa->print();
pa->p2();
delete pa;
rushman 2002-12-19
  • 打赏
  • 举报
回复
--class b:public a{
-- public:
-- void print(){cout<<"Class B"<<endl;}//该处加与不加virtual好象运行结果一样
--};
确实是一样的。因为在基类中函数print已经被声明为virtual了,在派生类中即便你不声明,他也是虚的。
winco 2002-12-19
  • 打赏
  • 举报
回复
表示这个类要用来被继承,而这个函数要被重载
winco 2002-12-19
  • 打赏
  • 举报
回复
表示这个类要用来被继承,而这个函数要被重载
俞庆平 2002-12-19
  • 打赏
  • 举报
回复
运行结果一样,但意义却不一样。不过这层意义
只是体现在逻辑上的意义,在编译器看来是一个样了。
因为基类如果定义某函数是虚函数,则默认的所有同名
(析构函肯定不同名,但本质上和同名的一样)的带参
相同函数均为虚函数,这一点是应该明确的。
顺便谈谈虚析构函数:
试想,如果一个基类的析构函数非虚,会出现什么结果
class a
{
~a();
}
class b:public a
{
~b();
}
a * pa = new b();
delete pa;
只会调用~a(),而不是调用~b(),问题就来了,在b内创建的数据不能被清除。

还有对于print()函数,如果你重写了 print(arg list);
如果在后继续的子类中加了带参数类型不同于原函数,
则会导致原虚函数被隐藏。
详见高质量C++编程指南。




64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧