(笔试题)关于C++的虚函数和多态性

以下两段程序的输出是什么?

程序1:

#include "stdio.h"
class Base
 {
 public:
     int Bar(char x)
     {
         return (int)(x);
     }
     virtual int Bar(int x)
     {
         return (2 * x);
     }
 };
 class Derived : public Base
 {
 public:
     int Bar(char x)
     {
         return (int)(-x);
     }
     int Bar(int x)
     {
         return (x / 2);
     }
 };
 int main(void)
 {
     Derived Obj;
     Base *pObj = &Obj;
     printf("%d,", pObj->Bar((char)(100)));
     printf("%d,", pObj->Bar(100));
 }

分析:

答案:100 50

Derived Obj;

Base *pObj = &Obj;

printf("%d,", pObj->Bar((char)(100)))

printf("%d,", pObj->Bar(100));

第一个Bar(char)是非虚函数,因此是静态绑定,静态绑定是指指针指向声明时的对象,pObj声明时为Base类,因此调用的是Base类的Bar(char)

第二个Bar(char)是虚函数,因此是动态绑定,动态绑定是指指针指向引用的对象,pObj引用Derived对象,因此调用的是Derived类的Bar(int)

程序2:

#include <iostream>
using namespace std;

class animal{
protected:
    int age;
public:
    virtual void print_age(void) = 0;
};

class dog : public animal{
public:
    dog(){ this->age = 2; }
    ~dog(){}
    virtual void print_age(void){ cout << "wang. my age=" << this->age << endl; }
};

class cat:public animal{
public :
    cat(){ this->age = 1; }
    ~cat(){}
    virtual void print_age(void){ cout << " Miao,my age= " << this->age << endl; }
};

int main(void){
    cat kitty;
    dog jd;
    animal *pa;
    int *p = (int *)(&kitty);
    int *q = (int *)(&jd);
    //cout << p[1] << endl;
    //cout << q[1] << endl;
    p[1] = q[1];
    pa = &kitty;
    pa->print_age();
    return 0;
}

分析:

答案:Miao, my age =2

int*p = (int*)(&kitty);

int*q = (int*)(&jd);

p和q是分别指向kitty和jd两个对象的首地址,因为类Cat和Dog都包含虚函数,所以kitty和jd两个对象均包含一个虚函数表,并通过一个指针指向它,p[0]和q[0]就是该虚函数表指针,而p[1]和q[1]则为该对象的数据成员即age的值,p[1]=1,q[1]=2

p[1] = q[1]=2;

kitty的age被修改为2,

animal *pa;

pa = &kitty;

pa->print_age();

pa指针声明时的类型为基类animal,它指向派生类kitty对象,典型的多态特性,则pa的静态类型为animal,动态类型为cat。

而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是kitty的成员函数print_age(),

cout << " Miao,my age= " << this->age << endl;

此时age=2.

时间: 2024-08-08 22:12:38

(笔试题)关于C++的虚函数和多态性的相关文章

C++虚函数与多态性

多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.多态(polymorphism),字面意思多种形状. 虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override). 包含纯虚函数的类称为抽象类.由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象. C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实

c++中虚函数和多态性

1.直接看下列代码: #include <iostream> using namespace std; class base{ public: void who(){ cout<<"this is the class of base!"<<endl; } }; class derivel1:public base{ public: void who(){ //一般的重载函数 cout<<"this is the class of

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数

笔试题中的常用功能函数

1. 请编写一个C 函数,该函数将给定的一个整数转换成字符串. void IntToCharChange(int num,  char* pval) { char strval[100]; int i , j; int val0 = 0; int val1 = 0; val0 = num; for(i=0; i<100; i++) { val1 = val0 % 10; //取余val0 = val0 / 10; // 取整strval[i] = val1 + 48;  // 数字-字符if(v

【C语言】【笔试题】C语言main函数参数含义

#include <stdio.h> int main(int argc, char *argv[],char *envp[])//第一个参数argc只的是变量的个数,第二个参数值得是对应变量的位置,第三个指的是main函数中的所有环境变量 { int i = 0; for (i = 0; envp[i] != NULL; i++) { printf("%s\n", envp[i]); } if (strcmp(argv[1], "-a") == 0)

【C语言】【面试题】【笔试题】模拟实现strstr函数

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<stdlib.h> char *my_strstr(const char *dst,const  char *src) {     assert(dst);     assert(src);     char *p = dst;     char *s1 = p;     char *s2 = src;     

[实用向] 算法笔试题中常用的一些函数

1.pow 幂运算(math.h) pow(2,n);//2^n 2.sqrt  开方运算 (math.h) sqrt(n) //开方 x*x = n,返回x https://support.office.com/zh-cn/article/SQRT-%E5%87%BD%E6%95%B0-654975c2-05c4-4831-9a24-2c65e4040fdf -----------------------------随时更新-------------------------------- 原文

虚函数与多态性

#include<iostream.h> class shape {public: int a; shape(int t) { a=t; } virtual void area() { cout<<"shape\n"; } }; class circle: public shape { public: void area(); circle(int x):shape(x){} }; void circle::area() { cout<<"