永发信息网

C++ 中虚函数的问题

答案:3  悬赏:60  手机版
解决时间 2021-05-04 17:00
  • 提问者网友:最爱你的唇
  • 2021-05-04 10:14

书上说当基类指针指向带有需函数的派生类时,会出现覆盖现象。可是下面的pt1=&cat1中其中cat并未带有需函数,为社么同样出现了覆盖现象?

#include<iostream>
using namespace std;
class Pet
{
public: virtual void Speak()
{
cout<<"How dose a pet speak?"<<endl;
}
};
class Cat:public Pet
{
public:
void Speak()
{
cout<<"miaomiao!"<<endl;
}
};
class Dog:public Pet
{
public:
void Speak()
{
cout<<"wangwang!"<<endl;

}
};
void main()
{
Pet *pt1,*pt2,*pt3,obj;
Dog dog1;
Cat cat1;
obj=dog1; //子类对象赋给基类对象,只能当做基类对象来使用
obj.Speak();
pt1=&cat1; //问题
pt1->Speak();
pt2=new Cat;
pt2->Speak();
pt3=new Dog;
pt3->Speak();
Pet &p4=cat1;
p4.Speak();
}


最佳答案
  • 五星知识达人网友:蓝房子
  • 2021-05-04 11:02
父类里面已经声明这个函数是虚函数了,子类里就会把它们都作为虚函数处理。c++中函数是否是同一个函数既要看函数名是否相同,又要看全部参数是否个数和类型都相同。如果相同的函数在子类中声明是虚函数,则父类里面就不会把它作为虚函数处理了。
全部回答
  • 1楼网友:冷風如刀
  • 2021-05-04 12:46
虚函数从基类声明那一刻起就存在了。后面任何继承自该基类的新类中同名的函数都会自动成为虚函数的。
  • 2楼网友:duile
  • 2021-05-04 11:44

呵呵,你可能没有看清楚书上所说的,出现了理解片面问题。首先,pet类中speak函数带有关键字virtual被说明为虚函数,之后,派生类相同界面的成员函数speak也默认其具有虚特性而可以省略virtual说明符。因此,定义虚函数时请注意:

1、一旦一个成员函数被说明为虚函数,不管经历多少派生类层,所有界面相同的重载函数都保持虚特性,以内派生类也是下一个派生类的基类。

2、虚函数必须是类的成员函数,不能将虚函数说明为全局函数,也不能说明为静态成员函数,因为虚函数的动态联编必须在类层次中依靠this指针实现。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯