C++多继承与多态

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C++多继承与多态

一、多继承,一个子类可以同时基类多个基类,这样的继承方式被称为多重继承。


#include <iostream>
using namespace std;
class Phone{//电话基类
public:
    Phone(const string& num):m_num(num){}
    void call(const string& num){
        cout << m_num << "打给" << num <<endl;
    }
private:
    string m_num;
};
class Player{//播放器基类
public:
    Player(const string& media)
        :m_media(media){}
    void play(const string& music){
        cout << m_media << "播放器播放" <<
            music << endl;
    }
private:
    string m_media;
};
class Computer{//计算机基类
public:
    Computer(const string& os):m_os(os){}
    void run(const string& app){
        cout << "在" << m_os << "系统上运行"
            << app << endl;
    }
private:
    string m_os;
};
class SmartPhone:public Phone,public Player,
    public Computer{//智能手机子类
public:
    SmartPhone(const string& num,
        const string& media,const string& os)
            :Phone(num),Player(media),
                Computer(os){}
};
int main(void)
{
    SmartPhone iphone(
            "13688886666","MP3","Android");
    iphone.call("010-12315");
    iphone.play("最炫小苹果");
    iphone.run("Angry Bird");
 
    SmartPhone* p1 = &iphone;
    Phone* p2 = p1;
    Player* p3 = p1;//+24
    Computer* p4 = p1;//+48
    cout << "p1=" << p1 << endl;
    cout << "p2=" << p2 << endl;
    cout << "p3=" << p3 << endl;
    cout << "p4=" << p4 << endl;
    cout << "sizeof(string)=" <<
        sizeof(string) << endl;//24
    return 0;
}
运行结果:
13688886666打给010-12315
MP3播放器播放最炫小苹果
在Android系统上运行Angry Bird
p1=009BFB68
p2=009BFB68
p3=009BFB84
p4=009BFBA0
sizeof(string)=28


二、多态


多态的语法特性除了要满足虚函数覆盖的条件,还必须通过指针或者通过引用调用虚函数,才能表现出来.


调用虚函数的指针也可以是成员函数中的this指针,当通过子类对象调用基类中成员函数,这时该成员函数中的this指针就是指向子类对象的基类指针,再通过它去调用虚函数同样可以表现多态的语法特性//重点掌握


#include <iostream>
using namespace std;
class Base{
public:
    virtual int cal(int x,int y){
        return x + y;
    }
    //void func(Base* this=&d)
    void func(void){
        //cout << this->cal(100,200) << endl;
        cout << cal(100,200) << endl;//20000
    }
};
class Derived:public Base{
public:
    int cal(int x,int y){
        return x * y;
    }
};
int main(void)
{
    Derived d;
    Base b = d;
    cout << b.cal(100,200) << endl;
   
    d.func();//func(&d)
   
    return 0;
}
运行结果:
300
20000


#include <iostream>
using namespace std;
class PDFParser{
public:
    void parse(const char* pdffile){
        cout << "解析出一个矩形" << endl;
        onRect();
        cout << "解析出一个圆形" << endl;
        onCircle();
        cout << "解析出一行文本" << endl;
        onText();    
    }
private:
    virtual void onRect(void) = 0;
    virtual void onCircle(void) = 0;
    virtual void onText(void) = 0;
};
class PDFRender:public PDFParser{
private:
    void onRect(void){
        cout << "绘制一个矩形" << endl;
    }
    void onCircle(void){
        cout << "绘制一个圆形" << endl;
    }
    void onText(void){
        cout << "显示一行文本" << endl;
    }
};
int main(void)
{
    PDFRender render;
    render.parse("xx.pdf");
    return 0;
}
运行结果:
解析出一个矩形
绘制一个矩形
解析出一个圆形
绘制一个圆形
解析出一行文本
显示一行文本
目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
36 2
C++入门12——详解多态1
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
78 11
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
29天前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
16 0
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
27 0
|
1月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
32 0
|
2月前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。
|
2月前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。