请问这句关于虚函数作用的描述是否有问题?

时间:2022-09-11 13:54:29
虚函数的作用:如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;反之如果定
义的虚函数,则通过指针调用的该同名函数是在指针指向的对象中定义的。

摘自:http://www.csdn.net/develop/article/11/11908.shtm
      原文作者:fireseed

8 个解决方案

#1


应该没有错把,可以自己写个程序试试看就知道了

#2


如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;

  不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了

#3


正确!
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
 virtual d();
};
class B:public A
{
public 
  d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象

#4


我认为没有问题!你用下边的代码测试一下就行了!
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
 void pout(){cout<<"派生类"<<endl;}
};
void main()
{
 b *t=new b;
 a *c=new a;
 c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
 void pout(){cout<<"派生类"<<endl;}
};
void main()
{
 b *t=new b;
 a *c=new a;
 c=t;
c->pout();
delete t;
delete c;
}

#5


喂!楼上的有没有试过啊!
 B b;
A *p =b;
  这什么呀!
   
 

#6


是楼上的楼上~(:

#7


如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;

  不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
  试一下
 #include <iostream>
using namespace std;
class A
{
public:
 virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{

public:
  void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------



int main(int argc, char* argv[])
{
  A* a=new B;
 a->f();
 int i;

        return 0;
}

#8


谢谢各位的帮助,我现在终于弄清楚了!

#1


应该没有错把,可以自己写个程序试试看就知道了

#2


如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;

  不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了

#3


正确!
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
 virtual d();
};
class B:public A
{
public 
  d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象

#4


我认为没有问题!你用下边的代码测试一下就行了!
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
 void pout(){cout<<"派生类"<<endl;}
};
void main()
{
 b *t=new b;
 a *c=new a;
 c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
 void pout(){cout<<"派生类"<<endl;}
};
void main()
{
 b *t=new b;
 a *c=new a;
 c=t;
c->pout();
delete t;
delete c;
}

#5


喂!楼上的有没有试过啊!
 B b;
A *p =b;
  这什么呀!
   
 

#6


是楼上的楼上~(:

#7


如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;

  不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
  试一下
 #include <iostream>
using namespace std;
class A
{
public:
 virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{

public:
  void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------



int main(int argc, char* argv[])
{
  A* a=new B;
 a->f();
 int i;

        return 0;
}

#8


谢谢各位的帮助,我现在终于弄清楚了!