c++虚函数与重载的疑问

这是关于搞清重载与虚函数的程序。
请问如下程序中调用test(Sub())时,b.fn(3.5)的运行结果为什么是3
而不是3.5呢??

#include<iostream>
using namespace std;
class Base
{
public:
virtual void fn(int x){cout<<"In Base class,int x= "<<x<<endl;}
};
class Sub:public Base
{
public:
virtual void fn(double x){cout<<"In Sub class,double x= "<<x<<endl;}
};
void test(Base& b)
{
b.fn(2);
b.fn(3.5);
}
int main()
{
test(Base());
test(Sub());
}
运行结果:
In Base class,int x=2
In Base class,int x=3
In Base class,int x=2
In Base class,int x=3
谢谢您解答~~

虚函数的作用是
函数重写

class Base
{
public:
virtual void fn(int x){cout<<"In Base class,int x= "<<x<<endl;}
};
class Sub:public Base
{
public:
void fn(int x){cout<<"In Sub class,double x= "<<x<<endl;}
// 函数的参数个数,参数类型,返回值及函数名要与基类一致,因为虚函数的
// 目的只是对函数内部进行重写,通过这样修改后 输出
// In Base class,int x=2
// In Base class,int x=3
// In Sub class,double x=2
// In Sub class,double x=3
};

你现在所写的 是属于函数重载
原因是参数类型不一样
因此不具备 虚函数的特性
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-02-11
不用引用,用指针试下!
第2个回答  2009-02-11
我补了一个函数,你看一下:
class Base
{
public:
virtual void fn(int x){cout<<"In Base class,int x= "<<x<<endl;}
};

class Sub:public Base
{
public:
virtual void fn(int x){cout<<"是真正的重写,下面那个是新的同名重载函数"<<endl;}
virtual void fn(double x){cout<<"In Sub class,double x= "<<x<<endl;}
};

C++多态性。 基类的虚函数和重载函数的区别,是不是一个是在运行时发生...
重载函数就是有其他函数和本函数同名。虚函数则是, 基类的虚函数,很可能被重载,用基类指针和引用调用虚函数时,如果该指针或引用实际指向或代表的对象是派生类的对象,并且该派生类重载了该虚函数,则调用的就是派生类重载了的虚函数,而不是基类的虚函数。这就是面向对象中的多态在C++中的实现方式...

C++中重载与重写函数区别及虚函数
重载,多个方法使用同一个方法名,必须明确的可以识别应该调用哪个方法。重写函数和虚函数很像,重新函数就是重新实现某个函数。虚函数,虚函数分为两种,纯虚函数和虚函数。纯虚函数在集成时必须进行实现【重写覆盖】,而虚函数可以不用重写【如果重写了,则覆盖掉原函数】。

简单C++重载问题
1.与基类函数同名;2.有相同的参数个数及对应类型;3.有相有返回值或满足类型兼容规则的指针,引用的返回值;你写的函数只有满足第1条;所以系统认为是另一个函数而非对虚函数的重写;如果满足了前两条而不满足第三条,也是错误,系统不认为你写了一个新函数,而认为你重写了基类虚函数且写错了,指出重写...

新手求教关于重载问题 求解释
重载是一种多态(如C++),有四种形式的多态:1.虚函数多态 2.模板多态 3.重载 4.转换 所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通...

关于C++虚拟函数的问题
virtual SubClass* afn()这个你要是把afn函数里面+个参数还可以实现一下函数的的重载 如果是你这样不能实现函数的重载,因为重载函数不以返回值来区分.把virtual SubClass* afn() 改为:virtual Base * afn()或者Base * afn()都可以 建议你去看一下虚函数的作用;下面是我跟你改的个简单一点的虚...

C++父类中声明了一个虚函数以后 是不是在子类 以及子类的子类中 都要...
基类声明虚函数只是提供一个接口,也就是实现多态的关键,子类基本都要继承的,如果有一个子类不需要实现这个函数,说明你的继承关系有问题,最好改变一下继承体系

c++ 类的多承继承中,第一层的父类中的虚函数
你的问题是C++中的多继承机制导致的 菱形继承问题(如下图所示) 的一个特例。1. 菱形问题是指R1中的成员在C1中会有两个拷贝。2. 当A1、B1使用virtual来继承R1时,菱形问题得到解决。3. 当A1、B1分别重载实现了R1中的相同的成员函数时,问题又来了:C1中有两个签名完全相同的函数,分别来自A1(...

求教,c++中什么时候使用虚函数??
首先你要明白C++为什么要引进虚函数这个机制,虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。从以上的定义来看,需函数简单的说就是为了让基类指针能够指向派生类...

c++只有虚函数才能被重写吗
没有virtual 关键字的情况下派生类有和基类相同的函数时直接覆盖(覆盖和重写不同,重写是事先就知道派生类可能重写该函数)基类的,不构成重写但达成效果类似。所以只有虚函数才能被重写。

C++中重载加减乘除等运算符的纯虚函数中的返回类型怎么定义??运算符...
纯虚函数表示基类是一个抽象类(ABC),因此要在派生类中具体实现运算符重载,由于运算符在运算过程中会生成一个临时对象;如:class Vector { private:int x;int y;};假设要在类中实现一个+运算符的重载:Vector Vector::operator+(const Vector & b) const { return Vector(x+b.x, y+b.y)...

相似回答
大家正在搜