一道理解虚函数(多态)机制的题目

一道理解虚函数(多态)机制的题目(摘抄)

以下程序输出为

class Base {
    public:
    Base(int j): i(j)  {}
    virtual~Base() {}
    void func1() {
        i *= 10;
        func2();
    }
    int getValue() {
        return  i;
    }
    protected:
    virtual void func2() {
        i++;
    }
    protected:
    int i;
};
class Child: public Base {
    public:
    Child(int j): Base(j) {}
    void func1() {
        i *= 100;
        func2();
    }
    protected:
    void func2() {
        i += 2;
    }
};
int main() {
    Base * pb = new Child(1);
    pb->func1();
    cout << pb->getValue() << endl; delete pb; }

答案:12

//
Base * pb = new Child(1), 首先创建子类对象,初始化为1,但是pb是BASE类型;
func1()不是虚函数,所以pb->func1()执行的是基类的func1函数,i= 10,然后调用func2()函数;
这里的func2是虚函数,要往下派生类寻找,找到后执行派生类中的func2(),此时,i = 12;
最后执行pb->getValue(),结果为12
---------------------
作者:小人物_cipher
来源:CSDN
原文:https://blog.csdn.net/u012605629/article/details/43709613

原文地址:https://www.cnblogs.com/Peter-fight/p/10993666.html

时间: 2024-11-06 17:37:48

一道理解虚函数(多态)机制的题目的相关文章

揭秘虚函数多态的实现细节

1.什么是虚函数 简单地说:那些被virtual关键字修饰的成员函数就是虚函数.其主要作用就是实现多态性. 多态性是面向对象的核心:它的主要的思想就是可以采用多种形式的能力,通过一个用户名字或者用户接口完成不同的实现.通常多态性被简单的描述为“一个接口,多个实现”.在C++里面具体的表现为通过基类指针访问派生类的函数和方法.看下面这段简单的代码: 1 class A 2 { 3 public: 4 void print(){cout << "this is A" <&

虚函数多态的实现细节

之前老是被问到虚函数多态的事情.......有个模棱两可的印象,正好遇到这个帖子了,所以再学习学习 http://www.cnblogs.com/shouce/p/5453729.html 1.什么是虚函数 简单地说:那些被virtual关键字修饰的成员函数就是虚函数.其主要作用就是实现多态性. 多态性是面向对象的核心:它的主要的思想就是可以采用多种形式的能力,通过一个用户名字或者用户接口完成不同的实现.通常多态性被简单的描述为“一个接口,多个实现”.在C++里面具体的表现为通过基类指针访问派生

虚函数实现机制

说到虚函数的实现方法,我们就不得不说到动态联编(dynamic binding)和静态联编(static binding).静态联编意味着编译器能够直接将标识符和存储的物理地址联系在一起.每一个函数都有一个唯一的物理地址,当编译器遇到一个函数调用时,它将用一个机械语言说明来替代函数调用,用来告诉CPU跳至这个函数的地址,然后对此函数进行操作.这个过程是在编译过程中完成的(注:调用的函数在编译时必须能够确定),所以静态联编也叫前期联编(early binding).但是,如果使用哪个函数不能在编译

C++虚函数运行机制

C++ 虚函数表解析 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以看看相关的C++的书籍.在这篇文章中,我只想从虚函

C++虚函数实现机制

C++中虚函数的实现机制主要是VTable和虚指针.详细如下: class A { public: virtual void f1(); virtual void f2(); private: int a; } class B { public: void f1(); private: int b; } 如上A,B两个类,编译器为A类准备了一个虚表VTableA如下: A::f1的地址 A::f2的地址 编译器为B类准备的VTableB如下:    B::f1的地址    A::f2的地址 B类

c++ 深入理解虚函数

为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚绑定 虚函数表 什么是多态? 相同对象收到不同消息或不同对象收到相同消息时产生的不同的动作. 静态多态 vs 动态多态 [-:>静态多态也叫做早绑定 class Rect //矩形类 { public: int calcArea(int width); int calcArea(int width,

虚函数运行机制

class A { public: virtual void foo (void) { ... } virtual void bar (void) { ... } }; class B : public A { public: void foo (void) { ... } }; int main(){ A* pa = new A; pa->foo (); // A::foo pa->bar (); // A::bar --------------------- A* pa = new B;

4.虚函数-多态

1.多态 多态的条件: (1):继承 (2):父类中有虚函数 (3):在子类中重新实现父类的虚函数(覆盖虚表) (4):把子类对象/指针赋值给父类的引用/指针 (5):通过父类的引用/指针来调用虚函数(只能调用父类中存在的函数) 用C++类以及多态来封装pthread进程 class CppThread{ public: CppThread(){} ~CppThread(){} void start(); virtual void run(){} protected: pthread_t id;

C++多态中虚函数的深入理解

c++中动态多态性是通过虚函数来实现的.静态多态性是通过函数的重载来实现的,在程序运行前的一种早绑定,动态多态性则是程序运行过程中的一种后绑定.根据下面的例子进行说明. #include <iostream> #include <string> using namespace std; class Shape//形状类 { public: double calcArea() { cout<<"calcArea"<<endl; return