编译的问题

WJN92 2018-08-20 03:44:19
为什么下面的代码不报错,或者不报警告呢?
既然你允许我传递子类的指针进去。但是你却没正确执行。
为什么编译器不把子类的内存布局传递进去呢?

struct a
{
int b;
int c;
};

struct d : public a
{
int e;
int f;
};

void test(a *t)
{
for (int i = 0; i < 10; i++)
{
int z = t[i].b;
}
}

void main()
{
d test12[10] = {};

for (int i = 0; i < 10; i++)
{
test12[i].b = i;
}

test(test12);

}
...全文
230 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-21
  • 打赏
  • 举报
回复
面向对象只是一种编程思想。
再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
schlafenhamster 2018-08-21
  • 打赏
  • 举报
回复
问题在于 你的那个 void test(a *t) 是 不能 多态的 。
要放 类里 才行:


// 父类
struct a
{
int b;
int c;
virtual void test(a* t)
{
for (int i = 0; i < 10; i++)
{
printf("ta[%d].b=%d\n",i,t[i].b);
}
};
};
// 派生类 (子类)
struct d : public a
{
int e;
int f;
int g;
virtual void test(d* t)
{
for (int i = 0; i < 10; i++)
{
printf("td[%d].b=%d\n",i,t[i].b);
}
};
};
void main()
{
d testd[10];//
for (int i = 0; i < 10; i++)
{
testd[i].b = i;
printf("testd[%d].b=%d\n",i,i);
}
testd[0].test(testd);
///////////////////////////////////////////
a testa[10];//
for (int ii = 0; ii < 10; ii++)
{
testa[ii].b = ii;
printf("testa[%d].b=%d\n",ii,ii);
}
//
testa[0].test(testa);

}
schlafenhamster 2018-08-21
  • 打赏
  • 举报
回复
或者
a test12[10] = {}; for (int i = 0; i < 10; i++) test12[i].b = i; test(test12);
schlafenhamster 2018-08-21
  • 打赏
  • 举报
回复
void test(a *t) // 不是 说了吗 要 传 派生类 d
{
for (int i = 0; i < 10; i++)
int z = t[i].get();
}
schlafenhamster 2018-08-21
  • 打赏
  • 举报
回复
这样 你写错了 编译器 就 会 告诉你了 !
赵4老师 2018-08-20
  • 打赏
  • 举报
回复
编译器
赵4老师 2018-08-20
  • 打赏
  • 举报
回复
编译期不是万能的。
WJN92 2018-08-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
编译期不是万能的。

我觉得这个是C++的问题了吧
WJN92 2018-08-20
  • 打赏
  • 举报
回复
引用 3 楼 chengbar 的回复:
明显不会,你这个不是多态


struct a
{
virtual int get() { return b; };
int b;
int c;
};

struct d : public a
{
virtual int get() { return e; };

int e;
int f;
};

void test(a *t)
{
for (int i = 0; i < 10; i++)
int z = t[i].get();
}

void main()
{
d test12[10] = {};

for (int i = 0; i < 10; i++)
test12[i].b = i;


test(test12);

}


可惜是这样会出错的
WJN92 2018-08-20
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
...



引用 5 楼 zhao3132453 的回复:
...


你们的做法就不叫面向对象了。
半雨微凉丶 2018-08-20
  • 打赏
  • 举报
回复
查看下内存可以看到
其实是已经传进去了

但是如果你要想获取到值得话,要
int z = t[i*2].b
schlafenhamster 2018-08-20
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include "stdio.h"

// 父类
struct a
{
int b;
int c;
};
// 派生类 (子类)
struct d : public a
{
int e;
int f;
};
// 传入 父类
//void test(a* t)
void test(d* t) // 请传入子类 d*
{
for (int i = 0; i < 10; i++)
{
int z = t[i].b;
printf("t[%d].b=%d\n",i,z);
}
}

void main()
{
d test12[10];//

for (int i = 0; i < 10; i++)
{
test12[i].b = i;
printf("test12[%d].b=%d\n",i,i);
}
//
test(test12);

}
sevancheng 2018-08-20
  • 打赏
  • 举报
回复
明显不会,你这个不是多态

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧