虚函数(1)

一、C++为什么引入虚函数,虚函数有哪些用途?

1.非虚的世界

对象的自恰性:对同样的函数调用,每个对象都会做出恰当的响应.

b. 通过指向子类对象的基类指针调用函数:

只能调用基类的成员函数,虽然指针指向子类对象.

一旦调用子类所特有的成员函数,将引发编译错误.

c.通过指向基类对象的子真调用函数:

可以调用子类的成员函数,尽管指针指向基类对象.

直接或简介地访问子类的成员变量,后果不可预知

d.名字隐藏

子类的成员函数隐藏基类的同名的成员函数.

#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
    Base(int data = 0):m_data(data){}
    void print(void) const
    {
        cout << m_data << endl;
    }
private:
    int m_data;
};
class Derived:public Base
{
public:
    Derived(int data,const string& info):
        Base(data),m_info(info){}
    void show(void) const
    {
        print();
        cout << m_info << endl;
    }
    void foo(void)
    {
        cout << "Derived::foo(void)" << endl;
    //    m_info = "abc";
    }
private:
    string m_info;
};

int main(void)
{
    Base b(100);
    Derived *pd = static_cast<Derived*>(&b); /*子类的指针指向父类*/
    /*pd->show();*/ /*这里可以成功调用但是调用的结果是未定义的
                  因为编译器在调用的时候只看类型.
                 */
    pd = NULL;
    pd->foo();  //这里是可以的,因为编译器在编译的时候只看类型.
    ((Derived*)0)->foo();
    /*函数并不存在于对象中,调用成员函数的时候,
     只要调用的类型是对的,就可以根据类型调用相应的
     成员函数.但是这种情况之下不能访问成员变量*/
    return 0;
}

2. 虚函数和名字隐藏

class 类名

{

  virtual 返回类型 函数名(形参表){...}

}

的成员函数,称为虚函数或方法

覆盖:

如果子类的成员函数和基类的虚函数具有相同的函数原型,那么该成员

函数就也是虚函数,无论其是否有virtual关键字,且对基类的虚函数

构成覆盖.

还有一种就是如果没有virtual的时候,只要函数名相同就会形成覆盖.

3.多态

如果子类提供了对基类虚函数的有效覆盖,那么通过一个指向子类对象的基类指针,

或者引用子类对象的基类引用,调用该虚函数,实际被调用的将是子类中覆盖

版本,而非基类中的原始,这种现象称之为多态.

多态的重要意义在于,一般的情况下,调用哪个类的成员函数是由调用者指针或引用

本身的类型决定的,而当多态发生的时候,调用哪个类的成员函数则

完全由调动者指针或引用的实际目标对象的类型决定的.

4.有效的虚函数的覆盖要满足如下的条件

该函数必须是成员函数,既不能是全局函数也不能是静态成员函数.

该函数必须在基类中用vitual关键字声明为虚函数

覆盖版本与基类版本必须拥有完全相同的签名,即是函数名,行参表和常属性严格一致.

如果基类版本返回基本数据类型,那么覆盖版本必须返回相同的类型的数据.

如果基类版本返回类类型对象的指针或引用,那么覆盖版本可以返回

其子类类型对象的指针或引用.

虚函数(1)

时间: 2024-11-05 12:23:26

虚函数(1)的相关文章

C++ 虚函数和虚继承浅析

本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有希望对大家学习C++有所帮助.下面都是以VC2008编译器对这两种机制内部实现为例. 虚函数 以下是百度百科对于虚函数的解释: 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1] 语法:virtual 函数返回类型 函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 函数声明和定义和普通的类成员函数一样,只是在返回值之前加入了关键字"vir

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt

C++:纯虚函数与抽象类

5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数类型 函数名(参数表)=0: 纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义.纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数.纯虚函数不具有函数的功能,不能被调用. //应用举例 #includ

含有虚函数的类sizeof大小

#include <iostream> using namespace std; class Base1{ virtual void fun1(){} virtual void fun11(){} public: virtual ~Base1(); }; class Base2{ virtual void fun2(){} }; class DerivedFromOne: public Base2 { virtual void fun2(){} virtual void fun22(){} }

C++沉思录之二——虚函数使用的时机

虚函数使用的时机 为什么虚函数不总是适用? 1. 虚函数有事会带来很大的消耗: 2. 虚函数不总是提供所需的行为: 3. 当我们不考虑继承当前类时,不必使用虚函数. 必须使用虚函数的情况: 1. 当你想删除一个表面上指向基类对象,实际却是指向派生类对象的指针,就需要虚析构函数. C++沉思录之二--虚函数使用的时机,布布扣,bubuko.com

C++中virtual(虚函数)的用法

转载:http://blog.csdn.net/foreverhuylee/article/details/34107615 在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念. 什么是虚函数: 虚函数是指一个类中你希望重载的成员函数 ,当你用一个  基类指针或引用   指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本. --摘自MSDN                                                 

C++抽象类与纯虚函数实战举例

虚函数与纯虚函数请参考:http://blog.csdn.net/hackbuteer1/article/details/7558868 #include <iostream> using namespace std; class Animal { public:     virtual void eat()=0;     virtual void sleep()=0; }; class Cat:public Animal { public:     void eat()     {     

c++ 虚函数详解

下面是对C++的虚函数的理解. 一,定义 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 classA { publi

多态&amp;虚函数

(1).对象类型: a.静态类型:对象声明时的类型,编译的时候确定 b.动态类型:对象的类型是运行时才能确定的 class A {}; class B:public A {}; int main() { B* b; A* a=b;//a的静态类型是A*,动态类型(运行时)类型是B* return 0; } (2).多态 a.静态多态:函数重载.泛性编程 int Add(int a,int b) { return a+b; } float Add(float a,float b) { return

[转]什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积