zoukankan      html  css  js  c++  java
  • Effective C++ 避免数组多态

     1 #include <iostream>
     2 #include <cstdlib>
     3 
     4 using namespace std;
     5 
     6 class Base {
     7     public:
     8         int idx;
     9         Base(int _idx=0) : idx(_idx) {}
    10         
    11         void show() {cout<<"Base"<<idx<<endl;}
    12         void print() {cout<<idx<<endl;}
    13 };
    14 
    15 class Derive : public Base {
    16     public:
    17         int time[20];
    18         Derive(int _idx = 0) : Base(_idx) {}
    19         void show() {cout<<"Derive"<<endl;}
    20 };
    21 
    22 void traversal(Base a[], int n) {
    23     for (int i=0; i < n; i++) {
    24         a[i].show();
    25     }
    26 }
    27 
    28 void deleteArray(Base a[]) {
    29     delete[] a;
    30 }
    31 
    32 int main() {
    33     Derive d[10];
    34     traversal(d, 10);
    35     
    36     deleteArray(d);
    37     
    38     system("pause");
    39     return 0;
    40 }

     delete[] a 将发生错误,因为编译器根据Base类型的大小来计算数组a中的各个元素的偏移地址再调用其析构函数,但是传入的实际上是Derive类型因而当程序运行时并不能得到元素正确的偏移,从而程序崩溃。

    这个不说以前还真没这么想过

  • 相关阅读:
    Git标签
    Git管理修改和撤销修改
    Git删除文件
    Git解决冲突
    Git的stash功能
    Git管理分支
    Git的多人协作模式
    Git相关指令
    LC7 整数翻转 + LC9 回文数
    LC1 两数之和
  • 原文地址:https://www.cnblogs.com/lailailai/p/3657532.html
Copyright © 2011-2022 走看看