C++中虚函数(virtual function) 的 使用范围

虚函数(virtual function) 在 基函数(base function) 和 派生函数(derived function) 之间可以覆写(override);

如果派生函数有与虚函数同名的函数, 则会隐藏虚函数, 但是虚函数还会在;

由于派生对象和基对象可以转换, 可以只使用基对象部分; 派生对象的虚函数会覆写基对象的虚函数;

代码:

/*
 * cppprimer.cpp
 *
 *  Created on: 2013.11.13
 *      Author: Caroline
 */

/*eclipse cdt, gcc 4.7.1*/

#include <iostream>  

class Base {
public:
    virtual int fcn () { //虚函数
        std::cout << "This base class [int fcn()]. " << std::endl;
        return 0;
    }
};
/*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/*/
class D1 : public Base {
public:
    int fcn (int) { //与基类的参数不同, 不是重载虚函数
        std::cout << "This derived 1 class [int fcn(int)]. " << std::endl;
        return 0;
    }
    virtual void f2 () { //虚函数
        std::cout << "This derived 1 class [f2()]. " << std::endl;
    }
};
class D2 : public D1 {
public:
    int fcn (int) { //隐藏基函数的同名函数
        std::cout << "This derived 2 class [int fcn(int)]. " << std::endl;
        return 0;
    }
    int fcn () { //重载基类的虚函数
        std::cout << "This derived 2 class [int fcn()]. " << std::endl;
        return 0;
    }
    void f2 () {
        std::cout << "This derived 2 class [f2()]. " << std::endl;
    }
};  

int main (void) {  

    Base bobj;
    D1 d1obj;
    D2 d2obj;  

    Base *bp1 = &bobj, *bp2 = &d1obj, *bp3 = &d2obj;
    bp1->fcn();
    bp2->fcn(); //未找到重载版本, 则使用基函数版本
    bp3->fcn(); //D2使用的是重载版本  

    D1 *d1p = &d1obj;
    D2 *d2p = &d2obj;
    d1p->f2();
    d2p->f2();  

    D1 *p1 = &d2obj;
    D2 *p2 = &d2obj;
    p1->fcn(10);
    p2->fcn(10);  

    return 0;  

}

输出:

This base class [int fcn()].
This base class [int fcn()].
This derived 2 class [int fcn()].
This derived 1 class [f2()].
This derived 2 class [f2()].
This derived 1 class [int fcn(int)].
This derived 2 class [int fcn(int)].

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 对象
, 函数
, 虚函数
, function
, override
, virtual
, 多态与虚函数
C++虚函数
virtual 虚函数、virtual function、virtual function c、虚函数的使用、虚函数使用,以便于您获取更多的相关知识。

时间: 2024-11-03 10:01:11

C++中虚函数(virtual function) 的 使用范围的相关文章

C++:虚函数(virtual function)缺省参数的异常表现及正确使用

避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义, 会产生异常; 虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically bound). 如果派生类(derived class)重新定义缺省值, 实例化, 执行函数正常; 但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动. talk is cheap, show you the code. 注意观察

C++中虚函数功能的实现机制

  要理解C++中虚函数是如何工作的,需要回答四个问题. 1. 什么是虚函数. 虚函数由于必须是在类中声明的函数,因此又称为虚方法.所有以virtual修饰符开始的成员函数都成为虚方法.此时注意是virtual修饰的成员函数不是virtual修饰的成员函数名. 例如:基类中定义: virtual void show(); //由于有virtual修饰因此是虚函数 voidshow(int); //虽然和前面声明的show虚函数同名,但不是虚函数. 所有的虚函数地址都会放在所属类的虚函数表vtbl

c++中虚函数和纯虚函数的作用与区别_C 语言

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void Move(); private: }; class CChild : public CMan { public: virtual void

C++中虚函数与纯虚函数的用法_C 语言

本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的.具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用

浅谈C++中虚函数实现原理揭秘_C 语言

编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟.      编译器对每个包含虚函数的类创建一个表(称为V TA B L E).在V TA B L E中,编译器放置特定类的虚函数地址.在每个带有虚函数的类 中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E.通过基类指针做虚函数调 用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使

PHP5中虚函数的实现方法分享_php技巧

请看下面的代码: 复制代码 代码如下: <?php class A { public function x() { echo "A::x() was called.\n"; } public function y() { self::x(); echo "A::y() was called.\n"; } public function z() { $this->x(); echo "A::z() was called.\n"; } }

C#中虚函数,抽象,接口的简单说明

函数 虚函数:由virtual声明,它允许在派生类中被重写,要重写方法,必须先声名为virtual public class myclass { public virtual int myint() { 函数体: } } class myclass1:myclass { public override int myint() { 函数体1: } } 抽象类.抽象函数:由abstract声明,在抽象类中可以定义抽象方法,抽象方法基本没有执行代码,派生类必须重写它,提供其执行代码 public ab

c#中虚函数的相关使用方法_C#教程

若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法. 虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允许有static,abstract,或override修饰符虚方法不能是私有的,因此不能使用private修饰符虚方法的执行:我们知道一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象

C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

1.虚函数(impure virtual) C++的虚函数主要作用是"运行时多态",父类中提供虚函数的实现,为子类提供默认的函数实现. 子类可以重写父类的虚函数实现子类的特殊化. 如下就是一个父类中的虚函数: class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } }; 2.纯虚函数(pure virtual) C++中包含纯虚函数的