C++多继承与多态

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 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;
}
运行结果:
解析出一个矩形
绘制一个矩形
解析出一个圆形
绘制一个圆形
解析出一行文本
显示一行文本
目录
相关文章
|
25天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
32 1
【C++】继承
|
25天前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
31 1
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
47 2
C++入门12——详解多态1
|
2月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
90 11
|
2月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
61 1
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
87 1
|
2月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
45 1
|
2月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
21 0
|
2月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
39 0
|
2月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
41 0