zoukankan      html  css  js  c++  java
  • 第51课 继承对象模型分析(上)

    在C++编译器内部类可以理解为结构体
    子类是由父类成员叠加子类新成员得到的
    class Derived : public Demo
    {
      int mk;
    }

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Demo
    {
    protected:
        int mi;
        int mj;
    public:
        virtual void print()
        {
            cout << "mi = " << mi << ", "
                 << "mj = " << mj << endl;
        }
    };
    
    class Derived : public Demo
    {
        int mk;
    public:
        Derived(int i, int j, int k)
        {
            mi = i;
            mj = j;
            mk = k;
        }
        
        void print()
        {
            cout << "mi = " << mi << ", "
                 << "mj = " << mj << ", "
                 << "mk = " << mk << endl;
        }
    };
    
    struct Test
    {
        void* p;
        int mi;
        int mj;
        int mk;
    };
    
    int main()
    {
        cout << "sizeof(Demo) = " << sizeof(Demo) << endl;         
        cout << "sizeof(Derived) = " << sizeof(Derived) << endl;  
        
        Derived d(1, 2, 3);
        Test* p = reinterpret_cast<Test*>(&d);
        
        cout << "Before changing ..." << endl;
        
        d.print();
        
        p->mi = 10;
        p->mj = 20;
        p->mk = 30;
        
        cout << "After changing ..." << endl;
        
        d.print();
        
        return 0;
    }

    C++多态的实现原理
    -当类中声明虚函数时,编译器会在类中生成一个虚函数表
    -虚函数表是一个存储成员函数地址的数据结构
    -虚函数表是由编译器自动生成与维护
    -virtual成员函数会被编译器放入虚函数表中
    -存在虚函数时,每个对象中都有一个指向虚函数表的指针

     

     

     从这个地方可以看出,C++中的多态是通过牺牲效率得到的。因此,在工程开发中,要考虑一个函数需不需要定义成一个虚函数。

  • 相关阅读:
    C# 日期格式化
    MVVM框架下,WPF实现Datagrid里的全选和选择
    【转】WPF 给DataGridTextColumn统一加上ToolTip
    C# 获取当前月第一天和最后一天 计算两个日期差多少天
    WPF 弹出UserControl
    斐讯Fir302b救砖教程
    mvc 传递匿名对象
    Java HttpGet
    Java xml object 互转
    HttpClientHandler
  • 原文地址:https://www.cnblogs.com/-glb/p/11967165.html
Copyright © 2011-2022 走看看